Skip to content

Commit 1fdc70a

Browse files
author
Steven Chen
committed
many to many orm
1 parent f7b771a commit 1fdc70a

3 files changed

Lines changed: 91 additions & 0 deletions

File tree

11_many_to_many_orm/__init__.py

Whitespace-only changes.

11_many_to_many_orm/db_init.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import datetime
2+
3+
from sqlalchemy import create_engine, String, ForeignKey, Table, Column
4+
from sqlalchemy.ext.declarative import declarative_base
5+
from sqlalchemy.orm import sessionmaker, Mapped, mapped_column, relationship
6+
from typing_extensions import Annotated
7+
from typing import List, Set
8+
9+
10+
engine = create_engine('mysql://root:test@localhost/testdb', echo=True)
11+
Base = declarative_base()
12+
13+
14+
int_pk = Annotated[int, mapped_column(primary_key=True)]
15+
required_unique_name = Annotated[str, mapped_column(String(128), unique=True, nullable=False)]
16+
required_string = Annotated[str, mapped_column(String(128), nullable=False)]
17+
18+
19+
association_table = Table(
20+
"user_role",
21+
Base.metadata,
22+
Column("user_id", ForeignKey("users.id"), primary_key=True),
23+
Column("role_id", ForeignKey("roles.id"), primary_key=True)
24+
)
25+
26+
27+
class User(Base):
28+
__tablename__ = "users"
29+
30+
id: Mapped[int_pk]
31+
name: Mapped[required_unique_name]
32+
password: Mapped[required_string]
33+
34+
roles: Mapped[List["Role"]] = relationship(secondary=association_table, lazy=False, back_populates="users")
35+
36+
def __repr__(self):
37+
return f'id: {self.id}, name: {self.name}'
38+
39+
40+
class Role(Base):
41+
__tablename__ = "roles"
42+
43+
id: Mapped[int_pk]
44+
name: Mapped[required_unique_name]
45+
46+
users: Mapped[List["User"]] = relationship(secondary=association_table, lazy=True, back_populates="roles")
47+
48+
def __repr__(self):
49+
return f'id: {self.id}, name: {self.name}'
50+
51+
52+
Base.metadata.create_all(engine)
53+
Session = sessionmaker(bind=engine)

11_many_to_many_orm/query.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from db_init import Session, User, Role
2+
3+
4+
def insert_records(s):
5+
role1 = Role(name="Admin")
6+
role2 = Role(name="Operator")
7+
8+
user1 = User(name="Jack", password="111")
9+
user2 = User(name="Tom", password="222")
10+
user3 = User(name="Mary", password="333")
11+
12+
user1.roles.append(role1)
13+
user1.roles.append(role2)
14+
15+
user2.roles.append(role1)
16+
user3.roles.append(role2)
17+
18+
s.add_all([user1, user2, user3])
19+
20+
s.commit()
21+
22+
23+
def select_user(s):
24+
u = s.query(User).filter(User.id == 1).one()
25+
print(u)
26+
print(u.roles)
27+
28+
29+
def select_role(s):
30+
r = s.query(Role).filter(Role.id == 2).one()
31+
print(r)
32+
print(r.users)
33+
34+
35+
session = Session()
36+
# insert_records(session)
37+
# select_user(session)
38+
select_role(session)

0 commit comments

Comments
 (0)