|
1 | 1 | import os |
2 | | -from dotenv import load_dotenv |
| 2 | + |
3 | 3 | import psycopg2 |
| 4 | +from dotenv import load_dotenv |
| 5 | + |
| 6 | + |
| 7 | +def main() -> None: |
| 8 | + load_dotenv() |
| 9 | + |
| 10 | + conn = psycopg2.connect( |
| 11 | + host=os.getenv('DB_HOST'), |
| 12 | + port=os.getenv('DB_PORT', '5432'), |
| 13 | + dbname=os.getenv('DB_NAME'), |
| 14 | + user=os.getenv('DB_USER'), |
| 15 | + password=os.getenv('DB_PASSWORD'), |
| 16 | + ) |
| 17 | + cur = conn.cursor() |
| 18 | + try: |
| 19 | + # Create product table with a unique constraint on name for idempotent seeding |
| 20 | + cur.execute(''' |
| 21 | + CREATE TABLE IF NOT EXISTS product ( |
| 22 | + id SERIAL PRIMARY KEY, |
| 23 | + name VARCHAR(100) NOT NULL UNIQUE, |
| 24 | + description TEXT, |
| 25 | + price NUMERIC(10, 2) NOT NULL, |
| 26 | + in_stock BOOLEAN DEFAULT TRUE, |
| 27 | + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
| 28 | + ); |
| 29 | + ''') |
| 30 | + |
| 31 | + # Insert seed data; skip rows whose name already exists |
| 32 | + cur.execute(''' |
| 33 | + INSERT INTO product (name, description, price, in_stock) VALUES |
| 34 | + ('Widget', 'A useful widget', 19.99, TRUE), |
| 35 | + ('Gadget', 'A fancy gadget', 29.99, TRUE), |
| 36 | + ('Thingamajig', 'An interesting thingamajig', 9.99, FALSE) |
| 37 | + ON CONFLICT (name) DO NOTHING; |
| 38 | + ''') |
| 39 | + |
| 40 | + conn.commit() |
| 41 | + print("Product table created and seeded.") |
| 42 | + finally: |
| 43 | + cur.close() |
| 44 | + conn.close() |
| 45 | + |
4 | 46 |
|
5 | | -load_dotenv() |
6 | | - |
7 | | -# Database connection |
8 | | -conn = psycopg2.connect( |
9 | | - host=os.getenv('DB_HOST'), |
10 | | - port=os.getenv('DB_PORT', '5432'), |
11 | | - dbname=os.getenv('DB_NAME'), |
12 | | - user=os.getenv('DB_USER'), |
13 | | - password=os.getenv('DB_PASSWORD') |
14 | | -) |
15 | | -cur = conn.cursor() |
16 | | - |
17 | | -# Create product table |
18 | | -cur.execute(''' |
19 | | -CREATE TABLE IF NOT EXISTS product ( |
20 | | - id SERIAL PRIMARY KEY, |
21 | | - name VARCHAR(100) NOT NULL, |
22 | | - description TEXT, |
23 | | - price NUMERIC(10, 2) NOT NULL, |
24 | | - in_stock BOOLEAN DEFAULT TRUE, |
25 | | - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
26 | | -); |
27 | | -''') |
28 | | - |
29 | | -# Insert seed data |
30 | | -cur.execute(''' |
31 | | -INSERT INTO product (name, description, price, in_stock) VALUES |
32 | | - ('Widget', 'A useful widget', 19.99, TRUE), |
33 | | - ('Gadget', 'A fancy gadget', 29.99, TRUE), |
34 | | - ('Thingamajig', 'An interesting thingamajig', 9.99, FALSE) |
35 | | -ON CONFLICT DO NOTHING; |
36 | | -''') |
37 | | - |
38 | | -conn.commit() |
39 | | -cur.close() |
40 | | -conn.close() |
41 | | -print("Product table created and seeded.") |
| 47 | +if __name__ == "__main__": |
| 48 | + main() |
0 commit comments