Initial commit: Sistema Autoparts DB

- Base de datos SQLite con información de vehículos
- Dashboard web con Flask y Bootstrap
- Scripts de web scraping para RockAuto
- Interfaz CLI para consultas
- Documentación completa del proyecto

Incluye:
- 12 marcas de vehículos
- 10,923 modelos
- 10,919 especificaciones de motores
- 12,075 combinaciones modelo-año-motor
This commit is contained in:
2026-01-19 08:45:03 +00:00
commit f395d67136
59 changed files with 10881 additions and 0 deletions

379
add_audi_data_extended.py Normal file
View File

@@ -0,0 +1,379 @@
"""
Script to add extended Audi vehicle data (2017-2021) to the database.
This includes additional models and year/motor combinations.
"""
import sqlite3
from typing import List, Tuple
def connect_db(db_path: str = "vehicle_database/vehicle_database.db") -> sqlite3.Connection:
"""Connect to the vehicle database."""
conn = sqlite3.connect(db_path)
conn.execute("PRAGMA foreign_keys = ON") # Enable foreign key constraints
return conn
def get_or_insert_brand(conn: sqlite3.Connection, brand_name: str) -> int:
"""Get brand ID or insert if it doesn't exist."""
cursor = conn.cursor()
# Check if brand already exists
cursor.execute("SELECT id FROM brands WHERE name = ?", (brand_name,))
result = cursor.fetchone()
if result:
return result[0] # Return existing ID
# Insert new brand
cursor.execute("INSERT INTO brands (name) VALUES (?)", (brand_name,))
conn.commit()
return cursor.lastrowid
def get_or_insert_model(conn: sqlite3.Connection, brand_id: int, model_name: str) -> int:
"""Get model ID or insert if it doesn't exist."""
cursor = conn.cursor()
# Check if model already exists for this brand
cursor.execute(
"SELECT id FROM models WHERE brand_id = ? AND name = ?",
(brand_id, model_name)
)
result = cursor.fetchone()
if result:
return result[0] # Return existing ID
# Insert new model
cursor.execute(
"INSERT INTO models (brand_id, name) VALUES (?, ?)",
(brand_id, model_name)
)
conn.commit()
return cursor.lastrowid
def get_or_insert_engine(conn: sqlite3.Connection, engine_name: str) -> int:
"""Get engine ID or insert if it doesn't exist."""
cursor = conn.cursor()
# Check if engine already exists
cursor.execute("SELECT id FROM engines WHERE name = ?", (engine_name,))
result = cursor.fetchone()
if result:
return result[0] # Return existing ID
# Insert new engine
cursor.execute("INSERT INTO engines (name) VALUES (?)", (engine_name,))
conn.commit()
return cursor.lastrowid
def get_or_insert_year(conn: sqlite3.Connection, year: int) -> int:
"""Get year ID or insert if it doesn't exist."""
cursor = conn.cursor()
# Check if year already exists
cursor.execute("SELECT id FROM years WHERE year = ?", (year,))
result = cursor.fetchone()
if result:
return result[0] # Return existing ID
# Insert new year
cursor.execute("INSERT INTO years (year) VALUES (?)", (year,))
conn.commit()
return cursor.lastrowid
def insert_version_relationship(conn: sqlite3.Connection, model_id: int, year_id: int, engine_id: int) -> None:
"""Insert a version relationship if it doesn't exist."""
cursor = conn.cursor()
# Check if version relationship already exists
cursor.execute(
"SELECT id FROM model_year_engine WHERE model_id = ? AND year_id = ? AND engine_id = ?",
(model_id, year_id, engine_id)
)
result = cursor.fetchone()
if not result:
# Insert new version relationship
cursor.execute(
"INSERT INTO model_year_engine (model_id, year_id, engine_id) VALUES (?, ?, ?)",
(model_id, year_id, engine_id)
)
conn.commit()
def main():
"""Main function to add extended Audi data."""
print("Adding extended Audi data (2017-2021)...")
# Connect to database
conn = connect_db()
# Get brand ID (should already exist)
brand_id = get_or_insert_brand(conn, "AUDI")
print(f"Brand 'AUDI' has ID: {brand_id}")
# Define additional models that might need to be added
additional_models = [
'A4 ALLROAD',
'A6 ALLROAD',
'Q2 QUATTRO'
]
# Insert additional models if they don't exist
for model_name in additional_models:
model_id = get_or_insert_model(conn, brand_id, model_name)
# Define versions (model, year, engine) for years 2017-2021
versions = [
# 2021
('A1', 2021, '1.5L L4 Turbocharged'),
('A1', 2021, '2.0L L4 Turbocharged'),
('A1', 2021, '999cc L3 Turbocharged'),
('A4', 2021, '2.0L L4 ELECTRIC/GAS Turbocharged'),
('A4', 2021, '2.0L L4 Turbocharged'),
('A4 ALLROAD', 2021, '2.0L L4 Turbocharged'),
('A5', 2021, '2.0L L4 Turbocharged'),
('A6', 2021, '2.0L L4 Turbocharged'),
('A6', 2021, '3.0L V6 Turbocharged'),
('A6 ALLROAD', 2021, '3.0L V6 Turbocharged'),
('A7', 2021, '2.0L L4 ELECTRIC/GAS Turbocharged'),
('A7', 2021, '2.0L L4 Turbocharged'),
('A7', 2021, '3.0L V6 Turbocharged'),
('A8', 2021, '3.0L V6 ELECTRIC/GAS Turbocharged'),
('A8', 2021, '3.0L V6 Turbocharged'),
('A8', 2021, '4.0L V8 Turbocharged'),
('E-TRON', 2021, 'ELECTRIC'),
('Q2', 2021, '1.4L L4 Turbocharged'),
('Q3', 2021, '1.4L L4 Turbocharged'),
('Q3', 2021, '2.0L L4 Turbocharged'),
('Q5', 2021, '2.0L L4 ELECTRIC/GAS Turbocharged'),
('Q5', 2021, '2.0L L4 Turbocharged'),
('Q7', 2021, '2.0L L4 Turbocharged'),
('Q7', 2021, '3.0L V6 Turbocharged'),
('Q8', 2021, '3.0L V6 Turbocharged'),
('R8', 2021, '5.2L V10'),
('RS3', 2021, '2.5L L5 Turbocharged'),
('RS5', 2021, '2.9L V6 Turbocharged'),
('RS6', 2021, '4.0L V8 Turbocharged'),
('RS7', 2021, '4.0L V8 Turbocharged'),
('RS Q3', 2021, '2.5L L5 Turbocharged'),
('RS Q8', 2021, '4.0L V8 Turbocharged'),
('S3', 2021, '2.0L L4 Turbocharged'),
('S4', 2021, '3.0L V6 Turbocharged'),
('S5', 2021, '3.0L V6 Turbocharged'),
('S6', 2021, '2.9L V6 Turbocharged'),
('S7', 2021, '2.9L V6 Turbocharged'),
('S8', 2021, '4.0L V8 Turbocharged'),
('SQ5', 2021, '3.0L V6 Turbocharged'),
('SQ7', 2021, '4.0L V8 Turbocharged'),
('SQ8', 2021, '4.0L V8 Turbocharged'),
('TT', 2021, '2.0L L4 Turbocharged'),
('TT', 2021, '2.5L L5 Turbocharged'),
# 2020
('A1', 2020, '1.5L L4 Turbocharged'),
('A1', 2020, '2.0L L4 Turbocharged'),
('A1', 2020, '999cc L3 Turbocharged'),
('A3', 2020, '1.4L L4 Turbocharged'),
('A3', 2020, '2.0L L4 Turbocharged'),
('A4', 2020, '2.0L L4 Turbocharged'),
('A4 ALLROAD', 2020, '2.0L L4 Turbocharged'),
('A5', 2020, '2.0L L4 Turbocharged'),
('A6', 2020, '2.0L L4 Turbocharged'),
('A6', 2020, '3.0L V6 Turbocharged'),
('A6 ALLROAD', 2020, '3.0L V6 Turbocharged'),
('A7', 2020, '3.0L V6 Turbocharged'),
('A8', 2020, '3.0L V6 ELECTRIC/GAS Turbocharged'),
('A8', 2020, '3.0L V6 Turbocharged'),
('A8', 2020, '4.0L V8 Turbocharged'),
('E-TRON', 2020, 'ELECTRIC'),
('Q2', 2020, '1.4L L4 Turbocharged'),
('Q2 QUATTRO', 2020, '2.0L L4 Turbocharged'),
('Q3', 2020, '1.4L L4 Turbocharged'),
('Q3', 2020, '2.0L L4 Turbocharged'),
('Q5', 2020, '2.0L L4 ELECTRIC/GAS Turbocharged'),
('Q5', 2020, '2.0L L4 Turbocharged'),
('Q7', 2020, '2.0L L4 Turbocharged'),
('Q7', 2020, '3.0L V6 Turbocharged'),
('Q8', 2020, '3.0L V6 Turbocharged'),
('R8', 2020, '5.2L V10'),
('RS3', 2020, '2.5L L5 Turbocharged'),
('RS5', 2020, '2.9L V6 Turbocharged'),
('RS6', 2020, '4.0L V8 Turbocharged'),
('RS7', 2020, '4.0L V8 Turbocharged'),
('RS Q3', 2020, '2.5L L5 Turbocharged'),
('RS Q8', 2020, '4.0L V8 Turbocharged'),
('S3', 2020, '2.0L L4 Turbocharged'),
('S4', 2020, '3.0L V6 Turbocharged'),
('S5', 2020, '3.0L V6 Turbocharged'),
('S6', 2020, '2.9L V6 Turbocharged'),
('S7', 2020, '2.9L V6 Turbocharged'),
('S8', 2020, '4.0L V8 Turbocharged'),
('SQ5', 2020, '3.0L V6 Turbocharged'),
('SQ7', 2020, '4.0L V8 Turbocharged'),
('SQ8', 2020, '4.0L V8 Turbocharged'),
('TT', 2020, '2.0L L4 Turbocharged'),
('TT', 2020, '2.5L L5 Turbocharged'),
# 2019
('A3', 2019, '1.4L L4 Turbocharged'),
('A3', 2019, '2.0L L4 Turbocharged'),
('A4', 2019, '2.0L L4 Turbocharged'),
('A4 ALLROAD', 2019, '2.0L L4 Turbocharged'),
('A5', 2019, '2.0L L4 Turbocharged'),
('A6', 2019, '2.0L L4 Turbocharged'),
('A6', 2019, '3.0L V6 Turbocharged'),
('A7', 2019, '3.0L V6 Turbocharged'),
('A8', 2019, '3.0L V6 Turbocharged'),
('A8', 2019, '4.0L V8 Turbocharged'),
('E-TRON', 2019, 'ELECTRIC'),
('Q2', 2019, '1.4L L4 Turbocharged'),
('Q2', 2019, '2.0L L4 Turbocharged'),
('Q3', 2019, '1.4L L4 Turbocharged'),
('Q3', 2019, '2.0L L4 Turbocharged'),
('Q5', 2019, '2.0L L4 Turbocharged'),
('Q7', 2019, '2.0L L4 Turbocharged'),
('Q7', 2019, '3.0L V6 DIESEL Turbocharged'),
('Q7', 2019, '3.0L V6 Supercharged'),
('Q8', 2019, '3.0L V6 Turbocharged'),
('R8', 2019, '5.2L V10'),
('RS3', 2019, '2.5L L5 Turbocharged'),
('RS5', 2019, '2.9L V6 Turbocharged'),
('RS6', 2019, '4.0L V8 Turbocharged'),
('RS7', 2019, '4.0L V8 Turbocharged'),
('RS Q3', 2019, '2.5L L5 Turbocharged'),
('RS Q8', 2019, '4.0L V8 Turbocharged'),
('S3', 2019, '2.0L L4 Turbocharged'),
('S4', 2019, '3.0L V6 Turbocharged'),
('S5', 2019, '3.0L V6 Turbocharged'),
('S6', 2019, '2.9L V6 Turbocharged'),
('S7', 2019, '2.9L V6 Turbocharged'),
('S8', 2019, '4.0L V8 Turbocharged'),
('SQ5', 2019, '3.0L V6 Turbocharged'),
('SQ7', 2019, '4.0L V8 Turbocharged'),
('SQ8', 2019, '4.0L V8 Turbocharged'),
('TT', 2019, '2.0L L4 Turbocharged'),
('TT', 2019, '2.5L L5 Turbocharged'),
# 2018
('A1', 2018, '1.4L L4 Turbocharged'),
('A1', 2018, '1.8L L4 Turbocharged'),
('A3', 2018, '1.4L L4 ELECTRIC/GAS Turbocharged'),
('A3', 2018, '1.4L L4 Turbocharged'),
('A3', 2018, '1.8L L4 Turbocharged'),
('A3', 2018, '2.0L L4 Turbocharged'),
('A4', 2018, '2.0L L4 Turbocharged'),
('A4 ALLROAD', 2018, '2.0L L4 Turbocharged'),
('A5', 2018, '2.0L L4 Turbocharged'),
('A6', 2018, '1.8L L4 Turbocharged'),
('A6', 2018, '2.0L L4 Turbocharged'),
('A6', 2018, '3.0L V6 Supercharged'),
('A7', 2018, '2.0L L4 Turbocharged'),
('A7', 2018, '3.0L V6 Supercharged'),
('A8', 2018, '3.0L V6 Supercharged'),
('A8', 2018, '4.0L V8 Turbocharged'),
('A8', 2018, '6.3L W12'),
('Q2', 2018, '1.4L L4 Turbocharged'),
('Q2', 2018, '2.0L L4 Turbocharged'),
('Q3', 2018, '1.4L L4 Turbocharged'),
('Q3', 2018, '2.0L L4 Turbocharged'),
('Q5', 2018, '2.0L L4 Turbocharged'),
('Q7', 2018, '2.0L L4 Turbocharged'),
('Q7', 2018, '3.0L V6 DIESEL Turbocharged'),
('Q7', 2018, '3.0L V6 Supercharged'),
('Q8', 2018, '3.0L V6 Turbocharged'),
('R8', 2018, '5.2L V10'),
('RS3', 2018, '2.5L L5 Turbocharged'),
('RS5', 2018, '2.9L V6 Turbocharged'),
('RS6', 2018, '4.0L V8 Turbocharged'),
('RS7', 2018, '4.0L V8 Turbocharged'),
('RS Q3', 2018, '2.5L L5 Turbocharged'),
('RS Q8', 2018, '4.0L V8 Turbocharged'),
('S3', 2018, '2.0L L4 Turbocharged'),
('S4', 2018, '3.0L V6 Supercharged'),
('S4', 2018, '3.0L V6 Turbocharged'),
('S5', 2018, '3.0L V6 Supercharged'),
('S5', 2018, '3.0L V6 Turbocharged'),
('S6', 2018, '4.0L V8 Turbocharged'),
('S7', 2018, '4.0L V8 Turbocharged'),
('S8', 2018, '4.0L V8 Turbocharged'),
('SQ5', 2018, '3.0L V6 Supercharged'),
('SQ5', 2018, '3.0L V6 Turbocharged'),
('SQ7', 2018, '4.0L V8 Turbocharged'),
('SQ8', 2018, '4.0L V8 Turbocharged'),
('TT', 2018, '1.8L L4 Turbocharged'),
('TT', 2018, '2.0L L4 Turbocharged'),
('TT', 2018, '2.5L L5 Turbocharged'),
# 2017
('A1', 2017, '1.4L L4 Turbocharged'),
('A1', 2017, '1.8L L4 Turbocharged'),
('A3', 2017, '1.4L L4 ELECTRIC/GAS Turbocharged'),
('A3', 2017, '1.4L L4 Turbocharged'),
('A3', 2017, '2.0L L4 Turbocharged'),
('A4', 2017, '2.0L L4 Turbocharged'),
('A4 ALLROAD', 2017, '2.0L L4 Turbocharged'),
('A5', 2017, '2.0L L4 Turbocharged'),
('A6', 2017, '1.8L L4 Turbocharged'),
('A6', 2017, '2.0L L4 Turbocharged'),
('A6', 2017, '3.0L V6 Supercharged'),
('A7', 2017, '2.0L L4 Turbocharged'),
('A7', 2017, '3.0L V6 Supercharged'),
('A8', 2017, '3.0L V6 Supercharged'),
('A8', 2017, '4.0L V8 Turbocharged'),
('A8', 2017, '6.3L W12'),
('Q3', 2017, '1.4L L4 Turbocharged'),
('Q3', 2017, '2.0L L4 Turbocharged'),
('Q5', 2017, '2.0L L4 Turbocharged'),
('Q5', 2017, '3.0L V6 DIESEL Turbocharged'),
('Q5', 2017, '3.0L V6 Supercharged'),
('Q7', 2017, '2.0L L4 Turbocharged'),
('Q7', 2017, '3.0L V6 DIESEL Turbocharged'),
('Q7', 2017, '3.0L V6 Supercharged'),
('Q8', 2017, '3.0L V6 Turbocharged'),
('R8', 2017, '5.2L V10'),
('RS3', 2017, '2.5L L5 Turbocharged'),
('RS5', 2017, '2.9L V6 Turbocharged'),
('RS6', 2017, '4.0L V8 Turbocharged'),
('RS7', 2017, '4.0L V8 Turbocharged'),
('RS Q3', 2017, '2.5L L5 Turbocharged'),
('RS Q8', 2017, '4.0L V8 Turbocharged'),
('S3', 2017, '2.0L L4 Turbocharged'),
('S4', 2017, '3.0L V6 Supercharged'),
('S4', 2017, '3.0L V6 Turbocharged'),
('S5', 2017, '3.0L V6 Supercharged'),
('S5', 2017, '3.0L V6 Turbocharged'),
('S6', 2017, '4.0L V8 Turbocharged'),
('S7', 2017, '4.0L V8 Turbocharged'),
('S8', 2017, '4.0L V8 Turbocharged'),
('SQ5', 2017, '3.0L V6 Supercharged'),
('SQ5', 2017, '3.0L V6 Turbocharged'),
('SQ7', 2017, '4.0L V8 Turbocharged'),
('SQ8', 2017, '4.0L V8 Turbocharged'),
('TT', 2017, '1.8L L4 Turbocharged'),
('TT', 2017, '2.0L L4 Turbocharged'),
('TT', 2017, '2.5L L5 Turbocharged')
]
# Insert version relationships
for model_name, year, engine in versions:
model_id = get_or_insert_model(conn, brand_id, model_name)
year_id = get_or_insert_year(conn, year)
engine_id = get_or_insert_engine(conn, engine)
insert_version_relationship(conn, model_id, year_id, engine_id)
print(f"Inserted {len(versions)} additional version relationships for AUDI vehicles (2017-2021)")
# Close connection
conn.close()
print("Extended Audi data added successfully!")
if __name__ == "__main__":
main()