From 904c908249e62743f1d538debf0a02b1bfd2ea24 Mon Sep 17 00:00:00 2001 From: Mann Patel <130435633+MannPatel0@users.noreply.github.com> Date: Sun, 23 Mar 2025 16:29:38 -0600 Subject: [PATCH] init local db with python --- README.md | 4 + SQL_code/Schema.sql | 292 +++++++++++++++++++++++++++++++++++++++++++- SQL_code/init-db.py | 3 + 3 files changed, 293 insertions(+), 6 deletions(-) create mode 100644 SQL_code/init-db.py diff --git a/README.md b/README.md index 6d91d20..47f82f1 100644 --- a/README.md +++ b/README.md @@ -22,4 +22,8 @@ ``` ### Database +1. To Create the DB use the command bellow +```Bash + python3 ./SQL_code/init-db.py +``` - MySql Version 9.2.0 diff --git a/SQL_code/Schema.sql b/SQL_code/Schema.sql index de35ebd..3f36cf3 100644 --- a/SQL_code/Schema.sql +++ b/SQL_code/Schema.sql @@ -1,3 +1,8 @@ +-- MySql Version 9.2.0 +CREATE DATABASE Marketplace; + +USE Marketplace; + -- User Entity CREATE TABLE User ( UserID INT AUTO_INCREMENT PRIMARY KEY, @@ -17,7 +22,7 @@ CREATE TABLE UserRole ( FOREIGN KEY (UserID) REFERENCES User (UserID) ON DELETE CASCADE ); --- Category Entity (must be created before Product or else error) +-- Category Entity (must be created before Product or else error) CREATE TABLE Category ( CategoryID INT PRIMARY KEY, Name VARCHAR(255) NOT NULL @@ -31,19 +36,20 @@ CREATE TABLE Product ( StockQuantity INT, UserID INT, Description TEXT, - Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, CategoryID INT NOT NULL, + Date DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (UserID) REFERENCES User (UserID), FOREIGN KEY (CategoryID) REFERENCES Category (CategoryID) ); +-- Fixed Image_URL table CREATE TABLE Image_URL ( URL VARCHAR(255), + ProductID INT, FOREIGN KEY (ProductID) REFERENCES Product (ProductID) -) +); - --- Review Entity (Many-to-One with User, Many-to-One with Product) +-- Fixed Review Entity (Many-to-One with User, Many-to-One with Product) CREATE TABLE Review ( ReviewID INT PRIMARY KEY, UserID INT, @@ -106,7 +112,7 @@ CREATE TABLE Product_Category ( FOREIGN KEY (CategoryID) REFERENCES Category (CategoryID) ); --- Login Authentication table, Store the userID,and a emailed code of user who have not authenticated, +-- Login Authentication table CREATE TABLE AuthVerification ( UserID INT AUTO_INCREMENT PRIMARY KEY, Email VARCHAR(100) UNIQUE NOT NULL, @@ -114,3 +120,277 @@ CREATE TABLE AuthVerification ( Authenticated BOOLEAN DEFAULT FALSE, Date DATETIME DEFAULT CURRENT_TIMESTAMP ); + +-- -- Insert sample categories +-- INSERT INTO +-- Category (CategoryID, Name) +-- VALUES +-- (1, 'Electronics'), +-- (2, 'Clothing'), +-- (3, 'Books'), +-- (4, 'Home & Garden'), +-- (5, 'Sports & Outdoors'); +-- -- -- USER CRUD OPERATIONS +-- -- -- Create User (INSERT) +-- -- INSERT INTO +-- -- User (Name, Email, UCID, Password, Phone, Address) +-- -- VALUES +-- -- ( +-- -- 'John Doe', +-- -- 'john@example.com', +-- -- 'UC123456', +-- -- 'hashed_password_here', +-- -- '555-123-4567', +-- -- '123 Main St' +-- -- ); +-- -- -- Set user role +-- -- INSERT INTO +-- -- UserRole (UserID, Client, Admin) +-- -- VALUES +-- -- (LAST_INSERT_ID (), TRUE, FALSE); +-- -- -- Read User (SELECT) +-- -- SELECT +-- -- u.*, +-- -- ur.Client, +-- -- ur.Admin +-- -- FROM +-- -- User u +-- -- JOIN UserRole ur ON u.UserID = ur.UserID +-- -- WHERE +-- -- u.UserID = 1; +-- -- -- Update User (UPDATE) +-- -- UPDATE User +-- -- SET +-- -- Name = 'John Smith', +-- -- Phone = '555-987-6543', +-- -- Address = '456 Elm St' +-- -- WHERE +-- -- UserID = 1; +-- -- -- Update User Role +-- -- UPDATE UserRole +-- -- SET +-- -- Admin = TRUE +-- -- WHERE +-- -- UserID = 1; +-- -- -- PRODUCT CRUD OPERATIONS +-- -- -- Create Product (INSERT) +-- -- INSERT INTO +-- -- Product ( +-- -- ProductID, +-- -- Name, +-- -- Price, +-- -- StockQuantity, +-- -- UserID, +-- -- Description, +-- -- CategoryID +-- -- ) +-- -- VALUES +-- -- ( +-- -- 1, +-- -- 'Smartphone', +-- -- 599.99, +-- -- 50, +-- -- 1, +-- -- 'Latest model smartphone with amazing features', +-- -- 1 +-- -- ); +-- -- -- Add product images with the placeholder URL +-- -- INSERT INTO +-- -- Image_URL (URL, ProductID) +-- -- VALUES +-- -- ('https://picsum.photos/id/237/200/300', 1), +-- -- ('https://picsum.photos/id/237/200/300', 1); +-- -- -- Create another product for recommendations +-- -- INSERT INTO +-- -- Product ( +-- -- ProductID, +-- -- Name, +-- -- Price, +-- -- StockQuantity, +-- -- UserID, +-- -- Description, +-- -- CategoryID +-- -- ) +-- -- VALUES +-- -- ( +-- -- 2, +-- -- 'Tablet', +-- -- 799.99, +-- -- 30, +-- -- 1, +-- -- 'High-performance tablet', +-- -- 1 +-- -- ); +-- -- -- Add placeholder images for the second product +-- -- INSERT INTO +-- -- Image_URL (URL, ProductID) +-- -- VALUES +-- -- ('https://picsum.photos/id/237/200/300', 2), +-- -- ('https://picsum.photos/id/237/200/300', 2); +-- -- -- Read Product (SELECT) +-- -- SELECT +-- -- p.*, +-- -- c.Name as CategoryName, +-- -- u.Name as SellerName, +-- -- i.URL as ImageURL +-- -- FROM +-- -- Product p +-- -- JOIN Category c ON p.CategoryID = c.CategoryID +-- -- JOIN User u ON p.UserID = u.UserID +-- -- LEFT JOIN Image_URL i ON p.ProductID = i.ProductID +-- -- WHERE +-- -- p.ProductID = 1; +-- -- -- Update Product (UPDATE) +-- -- UPDATE Product +-- -- SET +-- -- Name = 'Premium Smartphone', +-- -- Price = 649.99, +-- -- StockQuantity = 45, +-- -- Description = 'Updated description with new features' +-- -- WHERE +-- -- ProductID = 1; +-- -- -- CATEGORY CRUD OPERATIONS +-- -- -- Create Category (INSERT) +-- -- INSERT INTO +-- -- Category (CategoryID, Name) +-- -- VALUES +-- -- (6, 'Toys & Games'); +-- -- -- Read Category (SELECT) +-- -- SELECT +-- -- * +-- -- FROM +-- -- Category +-- -- WHERE +-- -- CategoryID = 6; +-- -- -- Update Category (UPDATE) +-- -- UPDATE Category +-- -- SET +-- -- Name = 'Toys & Children''s Games' +-- -- WHERE +-- -- CategoryID = 6; +-- -- -- REVIEW OPERATIONS +-- -- INSERT INTO +-- -- Review (ReviewID, UserID, ProductID, Comment, Rating) +-- -- VALUES +-- -- ( +-- -- 1, +-- -- 1, +-- -- 1, +-- -- 'Great product, very satisfied with the purchase!', +-- -- 5 +-- -- ); +-- -- -- TRANSACTION OPERATIONS +-- -- INSERT INTO +-- -- Transaction (TransactionID, UserID, ProductID, PaymentStatus) +-- -- VALUES +-- -- (1, 1, 1, 'Completed'); +-- -- -- HISTORY OPERATIONS +-- -- INSERT INTO +-- -- History (HistoryID, UserID, ProductID) +-- -- VALUES +-- -- (1, 1, 1); +-- -- -- Read History (SELECT) +-- -- SELECT +-- -- h.*, +-- -- p.Name as ProductName +-- -- FROM +-- -- History h +-- -- JOIN Product p ON h.ProductID = p.ProductID +-- -- WHERE +-- -- h.UserID = 1 +-- -- ORDER BY +-- -- h.Date DESC; +-- -- -- FAVORITES OPERATIONS +-- -- INSERT INTO +-- -- Favorites (UserID, ProductID) +-- -- VALUES +-- -- (1, 1); +-- -- -- Read Favorites (SELECT) +-- -- SELECT +-- -- f.*, +-- -- p.Name as ProductName, +-- -- p.Price +-- -- FROM +-- -- Favorites f +-- -- JOIN Product p ON f.ProductID = p.ProductID +-- -- WHERE +-- -- f.UserID = 1; +-- -- -- RECOMMENDATION OPERATIONS +-- -- INSERT INTO +-- -- Recommendation (RecommendationID_PK, UserID, RecommendedProductID) +-- -- VALUES +-- -- (1, 1, 2); +-- -- -- Read Recommendations (SELECT) +-- -- SELECT +-- -- r.*, +-- -- p.Name as RecommendedProductName, +-- -- p.Price, +-- -- p.Description +-- -- FROM +-- -- Recommendation r +-- -- JOIN Product p ON r.RecommendedProductID = p.ProductID +-- -- WHERE +-- -- r.UserID = 1; +-- -- -- Authentication Operations +-- -- -- Create verification code +-- -- INSERT INTO +-- -- AuthVerification (Email, VerificationCode) +-- -- VALUES +-- -- ('new_user@example.com', '123456'); +-- -- -- Update authentication status +-- -- UPDATE AuthVerification +-- -- SET +-- -- Authenticated = TRUE +-- -- WHERE +-- -- Email = 'new_user@example.com' +-- -- AND VerificationCode = '123456'; +-- -- -- Get top-selling products +-- -- SELECT +-- -- p.ProductID, +-- -- p.Name, +-- -- COUNT(t.TransactionID) as SalesCount, +-- -- SUM(p.Price) as TotalRevenue +-- -- FROM +-- -- Product p +-- -- JOIN Transaction t ON p.ProductID = t.ProductID +-- -- WHERE +-- -- t.PaymentStatus = 'Completed' +-- -- GROUP BY +-- -- p.ProductID, +-- -- p.Name +-- -- ORDER BY +-- -- SalesCount DESC +-- -- LIMIT +-- -- 10; +-- -- -- Get highest-rated products +-- -- SELECT +-- -- p.ProductID, +-- -- p.Name, +-- -- AVG(r.Rating) as AverageRating, +-- -- COUNT(r.ReviewID) as ReviewCount +-- -- FROM +-- -- Product p +-- -- JOIN Review r ON p.ProductID = r.ProductID +-- -- GROUP BY +-- -- p.ProductID, +-- -- p.Name +-- -- HAVING +-- -- ReviewCount >= 5 +-- -- ORDER BY +-- -- AverageRating DESC +-- -- LIMIT +-- -- 10; +-- -- -- Get user purchase history with product details +-- -- SELECT +-- -- t.TransactionID, +-- -- t.Date, +-- -- p.Name, +-- -- p.Price, +-- -- t.PaymentStatus +-- -- FROM +-- -- Transaction t +-- -- JOIN Product p ON t.ProductID = p.ProductID +-- -- WHERE +-- -- t.UserID = 1 +-- -- ORDER BY +-- -- t.Date DESC; diff --git a/SQL_code/init-db.py b/SQL_code/init-db.py new file mode 100644 index 0000000..910368a --- /dev/null +++ b/SQL_code/init-db.py @@ -0,0 +1,3 @@ +import subprocess +if (subprocess.run("mysql -u root mysql < SQL_code/Schema.sql", shell=True, check=True)): + print("successfully created the Marketplace databse")