Spaces:
Sleeping
Sleeping
| # File: db_schema.py | |
| import sqlite3 | |
| DB_NAME = "swiggy_orders.db" | |
| def init_db(db_path: str = DB_NAME) -> None: | |
| """ | |
| Initialize the SQLite database with the necessary tables. | |
| """ | |
| conn = sqlite3.connect(db_path) | |
| c = conn.cursor() | |
| # Orders metadata | |
| c.execute( | |
| """ | |
| CREATE TABLE IF NOT EXISTS orders ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| email_number INTEGER, | |
| order_date TEXT, | |
| order_time TEXT, | |
| restaurant_name TEXT, | |
| delivery_address TEXT, | |
| total_price REAL | |
| ) | |
| """ | |
| ) | |
| # Individual items per order | |
| c.execute( | |
| """ | |
| CREATE TABLE IF NOT EXISTS order_items ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| order_id INTEGER, | |
| item_name TEXT, | |
| quantity INTEGER, | |
| price REAL, | |
| FOREIGN KEY(order_id) REFERENCES orders(id) | |
| ) | |
| """ | |
| ) | |
| conn.commit() | |
| conn.close() | |
| def get_db_connection(db_path: str = DB_NAME) -> sqlite3.Connection: | |
| """Return a new connection to the database.""" | |
| return sqlite3.connect(db_path) | |
| def get_orders_by_date_from_db(date_str: str) -> list[dict]: | |
| """ | |
| Fetch all orders and their items for a given date from the database. | |
| """ | |
| conn = get_db_connection() | |
| c = conn.cursor() | |
| c.execute( | |
| "SELECT id, email_number, order_time, restaurant_name, delivery_address, total_price" | |
| " FROM orders WHERE order_date = ?", | |
| (date_str,) | |
| ) | |
| orders = [] | |
| for order_id, email_number, order_time, restaurant_name, delivery_address, total_price in c.fetchall(): | |
| # fetch items for this order | |
| c.execute( | |
| "SELECT item_name, quantity, price FROM order_items WHERE order_id = ?", | |
| (order_id,) | |
| ) | |
| items = [ | |
| {"name": name, "quantity": qty, "price": price} | |
| for name, qty, price in c.fetchall() | |
| ] | |
| orders.append({ | |
| "email_number": email_number, | |
| "order_date": date_str, | |
| "order_time": order_time, | |
| "restaurant_name": restaurant_name, | |
| "delivery_address": delivery_address, | |
| "items": items, | |
| "total_price": total_price | |
| }) | |
| conn.close() | |
| return orders | |
| def save_orders_to_db(date_str: str, orders: list[dict]) -> None: | |
| """ | |
| Insert scraped orders and their items for a given date into the database. | |
| """ | |
| conn = get_db_connection() | |
| c = conn.cursor() | |
| for order in orders: | |
| c.execute( | |
| """ | |
| INSERT INTO orders | |
| (email_number, order_date, order_time, restaurant_name, delivery_address, total_price) | |
| VALUES (?, ?, ?, ?, ?, ?) | |
| """, | |
| ( | |
| order["email_number"], | |
| date_str, | |
| order["order_time"], | |
| order["restaurant_name"], | |
| order["delivery_address"], | |
| order["total_price"] | |
| ) | |
| ) | |
| order_id = c.lastrowid | |
| for item in order.get("items", []): | |
| c.execute( | |
| """ | |
| INSERT INTO order_items | |
| (order_id, item_name, quantity, price) | |
| VALUES (?, ?, ?, ?) | |
| """, | |
| ( | |
| order_id, | |
| item["name"], | |
| item["quantity"], | |
| item["price"] | |
| ) | |
| ) | |
| conn.commit() | |
| conn.close() | |