Added SQLAlchemy Example
This commit is contained in:
26
SQLAlchemy-ORM/demo.py
Normal file
26
SQLAlchemy-ORM/demo.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
"""Very quick introduction to python classes"""
|
||||||
|
|
||||||
|
from typing import override
|
||||||
|
|
||||||
|
|
||||||
|
class Food:
|
||||||
|
name: str
|
||||||
|
calories: int
|
||||||
|
|
||||||
|
count: int = 1
|
||||||
|
|
||||||
|
def __init__(self, name: str, calories: int) -> None:
|
||||||
|
self.name = name
|
||||||
|
self.calories = calories
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return f"A(n) {self.name} with {self.calories}"
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"Food({self.name!r}, {self.calories!r})"
|
||||||
|
|
||||||
|
|
||||||
|
apple = Food("apple", 100)
|
||||||
|
pizza = Food("pizza", 300)
|
||||||
117
SQLAlchemy-ORM/quick_start.py
Normal file
117
SQLAlchemy-ORM/quick_start.py
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
"""Example code from the ORM Quick Start.
|
||||||
|
|
||||||
|
https://docs.sqlalchemy.org/en/20/orm/quickstart.html
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import override
|
||||||
|
|
||||||
|
from sqlalchemy import ForeignKey, String, create_engine, select
|
||||||
|
from sqlalchemy.orm import DeclarativeBase, Mapped, Session, mapped_column, relationship
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Declare Models
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
class Base(DeclarativeBase):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class User(Base):
|
||||||
|
__tablename__: str = "user_account"
|
||||||
|
|
||||||
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
name: Mapped[str] = mapped_column(String(30))
|
||||||
|
fullname: Mapped[str | None] = mapped_column(String, nullable=True)
|
||||||
|
|
||||||
|
addresses: Mapped[list["Address"]] = relationship(
|
||||||
|
back_populates="user", cascade="all, delete-orphan"
|
||||||
|
)
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"User(id={self.id!r}, name={self.name!r}, fullname={self.fullname!r})"
|
||||||
|
|
||||||
|
|
||||||
|
class Address(Base):
|
||||||
|
__tablename__: str = "address"
|
||||||
|
|
||||||
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
email_address: Mapped[str] = mapped_column(String, nullable=True)
|
||||||
|
user_id: Mapped[int] = mapped_column(ForeignKey("user_account.id"))
|
||||||
|
|
||||||
|
user: Mapped["User"] = relationship(back_populates="addresses")
|
||||||
|
|
||||||
|
@override
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"Address(id={self.id!r}, email_address={self.email_address!r})"
|
||||||
|
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Create an Engine / Emit CREATE TABLE DDL
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
engine = create_engine("sqlite://", echo=True)
|
||||||
|
|
||||||
|
Base.metadata.create_all(engine)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Create Objects and Persist
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
with Session(engine) as session:
|
||||||
|
spongebob = User(
|
||||||
|
name="spongebob",
|
||||||
|
fullname="Spongebob Squarepants",
|
||||||
|
addresses=[Address(email_address="spongebob@sqlalchemy.org")],
|
||||||
|
)
|
||||||
|
sandy = User(
|
||||||
|
name="sandy",
|
||||||
|
fullname="Sandy Cheeks",
|
||||||
|
addresses=[
|
||||||
|
Address(email_address="sandy@sqlalchemy.org"),
|
||||||
|
Address(email_address="sandy@squirrelpower.org"),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
patrick = User(name="patrick", fullname="Patrick Star")
|
||||||
|
session.add_all([spongebob, sandy, patrick])
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Simple SELECT / SELECT with JOIN
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
session = Session(engine)
|
||||||
|
|
||||||
|
stmt = select(User).where(User.name.in_(["spongebob", "sandy"]))
|
||||||
|
for user in session.scalars(stmt):
|
||||||
|
print(user)
|
||||||
|
|
||||||
|
stmt = (
|
||||||
|
select(Address)
|
||||||
|
.join(Address.user)
|
||||||
|
.where(User.name == "sandy")
|
||||||
|
.where(Address.email_address == "sandy@sqlalchemy.org")
|
||||||
|
)
|
||||||
|
sandy_address = session.scalars(stmt).one()
|
||||||
|
print(sandy_address)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Make Changes / Some Deletes
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
stmt = select(User).where(User.name == "patrick")
|
||||||
|
patrick = session.scalars(stmt).one()
|
||||||
|
|
||||||
|
patrick.addresses.append(Address(email_address="patrickstar@sqlalchemy.org"))
|
||||||
|
sandy_address.email_address = "sandy_cheeks@sqlalchemy.org"
|
||||||
|
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
sandy = session.get(User, 2)
|
||||||
|
assert sandy is not None
|
||||||
|
sandy.addresses.remove(sandy_address)
|
||||||
|
|
||||||
|
session.flush()
|
||||||
|
session.delete(patrick)
|
||||||
|
session.commit()
|
||||||
@@ -11,9 +11,12 @@
|
|||||||
enable = true;
|
enable = true;
|
||||||
requirements = ''
|
requirements = ''
|
||||||
Faker==37.8.0
|
Faker==37.8.0
|
||||||
|
greenlet==3.2.4
|
||||||
psycopg==3.2.10
|
psycopg==3.2.10
|
||||||
psycopg-binary==3.2.10
|
psycopg-binary==3.2.10
|
||||||
python-dotenv==1.1.1
|
python-dotenv==1.1.1
|
||||||
|
SQLAlchemy==2.0.44
|
||||||
|
typing_extensions==4.15.0
|
||||||
tzdata==2025.2
|
tzdata==2025.2
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user