文章目录
- 表关系
- ORM表示 1v1
- ORM表示 1vm
表关系
- 1:1,表A 中的一条记录,仅对应表B中的一条记录;表B的一条记录,仅对应表A的一条记录。
- 1:m,表A中的一条记录,对应表B中的多条记录,表B中的一条记录,仅对应表A的中的一条;(多的一方创建外键)
- m:n ,表A 中的一条记录,可对应表B中的多条记录;表B的一条记录,也可对应表A的多条记录。
ORM表示 1v1
pass
ORM表示 1vm
- 表结构
- 创建模型类
from sqlalchemy import Column, Integer, Float, String, Enum, ForeignKey, VARCHAR
from sqlalchemy.dialects.mysql import VARCHAR
from sqlalchemy.orm import declarative_base, relationship, Session, sessionmaker # sessionmaker返回一个会话类
from sqlalchemy import create_engine
# base class
Base = declarative_base()
# Address
class Address(Base):
__tablename__ = "address_t"
id = Column(Integer, primary_key=True)
# 地址字段, mysql数据库使用VARCHAR类型,其他使用String类型
title = Column("address", String(50).with_variant(VARCHAR(50, charset="utf8"), "mysql"), nullable=False)
# 外键
user_id = Column(Integer, ForeignKey("user_t.id"), nullable=True)
# 关系(非表字段),模型类之间的引用
# back_populates 双向的 反向引用(通过属性)
# cascade 级联动作 delete-orphan 表示子表断开引用主表时,删除记录,仅用于1:m 中1的一方
user = relationship("User", back_populates="addresses")
def __repr__(self): # 打印对象时的输出
return f"{self.title}"
# User
class User(Base):
__tablename__ = "user_t"
id = Column(Integer, primary_key=True)
name = Column(String(30), unique=True)
fullname = Column(String(50))
# 枚举
sex = Column(Enum("male", "female", name="sex"))
age = Column(Integer)
role_id = Column(Integer, ForeignKey("role_t.id"), nullable=True)
# 关系
addresses = relationship("Address", back_populates="user", cascade="all, delete-orphan")
role = relationship("Role", back_populates="users")
def __repr__(self):
return f"{self.name}"
# Role
class Role(Base):
__tablename__ = "role_t"
id = Column(Integer, primary_key=True)
name = Column(String(30), unique=True)
# 关系
users = relationship("User", back_populates="role")
def __repr__(self):
return f"{self.name!r}"
# 创建懒连接
sqlalchemy_database_uri = "postgresql://user:pw@ip:port/dbxx"
engine = create_engine(sqlalchemy_database_uri, echo=True)
# 删除所有的表
Base.metadata.drop_all(engine)
# 创建所有的表
Base.metadata.create_all(engine)
# 创建会话
with Session(engine) as session:
jack = User(name="jack", fullname="张三", sex="male", age=34, addresses=[Address(title="北京"), Address(title="河南")])
tom = User(name="tom", fullname="李四", sex="female", age=25, addresses=[Address(title="武汉")])
# 创建角色
role = Role(name="老师", users=[jack, tom])
# 仅仅添加一个****主表记录**** 即可,子表记录 连带添加
session.add(role)
session.commit() # 事务的最终提交
主表记录插入时,连带子表记录一起插入。