| import os |
| import argparse |
| import pandas as pd |
| from sqlalchemy import create_engine, text |
|
|
| def load_database(): |
| parser = argparse.ArgumentParser(description="Load cleaned supply chain data into MySQL.") |
| parser.add_argument("--host", default="localhost", help="MySQL host (default: localhost)") |
| parser.add_argument("--port", default="3306", help="MySQL port (default: 3306)") |
| parser.add_argument("--user", default="root", help="MySQL username (default: root)") |
| parser.add_argument("--password", default="", help="MySQL password (default: empty)") |
| args = parser.parse_args() |
|
|
| cleaned_csv_path = os.path.join("Data", "cleaned_data.csv") |
| schema_sql_path = os.path.join("SQL", "schema.sql") |
|
|
| if not os.path.exists(cleaned_csv_path): |
| print(f"Error: Cleaned data file not found at {cleaned_csv_path}. Please run data_cleaning.py first.") |
| return |
|
|
| if not os.path.exists(schema_sql_path): |
| print(f"Error: Schema SQL file not found at {schema_sql_path}.") |
| return |
|
|
| |
| conn_url_base = f"mysql+mysqlconnector://{args.user}:{args.password}@{args.host}:{args.port}" |
| print(f"Connecting to MySQL server at {args.host}:{args.port}...") |
| |
| try: |
| engine = create_engine(conn_url_base) |
| |
| with engine.connect() as conn: |
| conn.execute(text("CREATE DATABASE IF NOT EXISTS supply_chain_db;")) |
| conn.commit() |
| print("Database 'supply_chain_db' checked/created.") |
| |
| |
| conn_url_db = f"{conn_url_base}/supply_chain_db" |
| db_engine = create_engine(conn_url_db) |
| |
| print(f"Executing schema from {schema_sql_path}...") |
| with open(schema_sql_path, "r", encoding="utf-8") as f: |
| schema_sql = f.read() |
| |
| |
| sql_commands = [cmd.strip() for cmd in schema_sql.split(";") if cmd.strip()] |
| |
| with db_engine.connect() as conn: |
| |
| for cmd in sql_commands: |
| |
| if cmd.startswith("--") or cmd.startswith("/*"): |
| continue |
| clean_cmd = cmd.upper() |
| if clean_cmd.startswith("CREATE DATABASE") or clean_cmd.startswith("USE "): |
| continue |
| conn.execute(text(cmd)) |
| conn.commit() |
| |
| print("Database schema created successfully.") |
| except Exception as e: |
| print(f"\nFailed to connect or set up database: {e}") |
| print("Please check your MySQL credentials. You can pass them as arguments:") |
| print("python Scripts/database_loader.py --user <username> --password <password> --host <host> --port <port>") |
| return |
|
|
| |
| conn_url_db = f"{conn_url_base}/supply_chain_db" |
| db_engine = create_engine(conn_url_db) |
|
|
| |
| print(f"Reading cleaned data from {cleaned_csv_path}...") |
| df = pd.read_csv(cleaned_csv_path) |
|
|
| |
| print("Normalizing data and uploading to tables...") |
|
|
| try: |
| |
| print("- Loading 'departments'...") |
| departments_df = df[["department_id", "department_name"]].drop_duplicates().dropna(subset=["department_id"]) |
| departments_df.to_sql("departments", con=db_engine, if_exists="append", index=False) |
| print(f" Loaded {len(departments_df)} departments.") |
|
|
| |
| print("- Loading 'categories'...") |
| categories_df = df[["category_id", "category_name"]].drop_duplicates().dropna(subset=["category_id"]) |
| categories_df.to_sql("categories", con=db_engine, if_exists="append", index=False) |
| print(f" Loaded {len(categories_df)} categories.") |
|
|
| |
| print("- Loading 'customers'...") |
| |
| customers_df = df[[ |
| "customer_id", "customer_fname", "customer_lname", |
| "customer_segment", "customer_street", "customer_city", |
| "customer_state", "customer_country", "customer_zipcode" |
| ]].drop_duplicates(subset=["customer_id"]) |
| customers_df.to_sql("customers", con=db_engine, if_exists="append", index=False) |
| print(f" Loaded {len(customers_df)} customers.") |
|
|
| |
| print("- Loading 'products'...") |
| products_df = df[[ |
| "product_card_id", "product_name", "product_category_id", |
| "product_price", "product_status" |
| ]].drop_duplicates(subset=["product_card_id"]) |
| |
| products_df = products_df[products_df["product_category_id"].isin(categories_df["category_id"])] |
| products_df.to_sql("products", con=db_engine, if_exists="append", index=False) |
| print(f" Loaded {len(products_df)} products.") |
|
|
| |
| print("- Loading 'orders'...") |
| orders_df = df[[ |
| "order_id", "order_customer_id", "order_date", "shipping_date", |
| "shipping_mode", "days_for_shipping_real", "days_for_shipping_scheduled", |
| "delivery_status", "late_delivery_risk", "order_status", "type", |
| "market", "order_region", "order_country", "order_state", "order_city", |
| "order_zipcode", "latitude", "longitude" |
| ]].drop_duplicates(subset=["order_id"]) |
| |
| orders_df = orders_df[orders_df["order_customer_id"].isin(customers_df["customer_id"])] |
| orders_df.to_sql("orders", con=db_engine, if_exists="append", index=False) |
| print(f" Loaded {len(orders_df)} orders.") |
|
|
| |
| print("- Loading 'order_items'...") |
| order_items_df = df[[ |
| "order_item_id", "order_id", "order_item_cardprod_id", |
| "order_item_quantity", "order_item_product_price", "order_item_discount", |
| "order_item_discount_rate", "order_item_total", "sales", |
| "benefit_per_order", "order_item_profit_ratio" |
| ]].drop_duplicates(subset=["order_item_id"]) |
| |
| order_items_df = order_items_df[ |
| order_items_df["order_id"].isin(orders_df["order_id"]) & |
| order_items_df["order_item_cardprod_id"].isin(products_df["product_card_id"]) |
| ] |
| |
| |
| order_items_df.to_sql("order_items", con=db_engine, if_exists="append", index=False, chunksize=10000) |
| print(f" Loaded {len(order_items_df)} order items.") |
|
|
| print("\nAll tables loaded successfully!") |
| |
| |
| with db_engine.connect() as conn: |
| result = conn.execute(text("SELECT COUNT(*) FROM orders")) |
| count = result.scalar() |
| print(f"Verification: Found {count} orders loaded in database.") |
| |
| except Exception as e: |
| print(f"Error loading normalized tables: {e}") |
|
|
| if __name__ == "__main__": |
| load_database() |
|
|