-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRelationalDB-Python.py
More file actions
76 lines (51 loc) · 2.3 KB
/
Copy pathRelationalDB-Python.py
File metadata and controls
76 lines (51 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from sqlalchemy import create_engine, String, ForeignKey, Boolean, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Mapped, mapped_column, sessionmaker, relationship
engine = create_engine("sqlite:///shop.db")
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(100), nullable=False)
email: Mapped[str] = mapped_column(String(200), nullable=False, unique=True)
orders: Mapped[list["Order"]] = relationship(back_populates="user")
class Product(Base):
__tablename__ = "products"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(100), nullable=False)
price: Mapped[int] = mapped_column(nullable=False)
order_items: Mapped[list["Order"]] = relationship(back_populates="product")
class Order(Base):
__tablename__ = "orders"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False)
product_id: Mapped[int] = mapped_column(ForeignKey("products.id"), nullable=False)
quantity: Mapped[int] = mapped_column(nullable=False)
status: Mapped[bool] = mapped_column(Boolean, default=False)
user: Mapped["User"] = relationship(back_populates="orders")
product: Mapped["Product"] = relationship(back_populates="order_items")
Base.metadata.create_all(engine)
# inserting data
user1 = User(name="Yousef", email="Yousef@test.com")
product1 = Product(name="Laptop", price=1000)
session.add_all([user1, product1])
session.commit()
order1 = Order(user_id=user1.id, product_id=product1.id, quantity=2, status=False)
order2 = Order(user_id=user1.id, product_id=product1.id, quantity=1, status=True)
session.add_all([order1, order2])
session.commit()
print("\n--- Not Shipped Orders ---")
not_shipped_orders = session.query(Order).filter(Order.status == False).all()
for order in not_shipped_orders:
print(f"Order {order.id} is NOT shipped")
print("\n--- Orders Per User ---")
order_counts = (
session.query(User.name, func.count(Order.id))
.join(Order)
.group_by(User.id)
.all()
)
for name, count in order_counts:
print(f"{name} has {count} orders")