主页 > 互联网  > 

pythonsqlalchemy(ORM)-02表关系

pythonsqlalchemy(ORM)-02表关系

文章目录 表关系ORM表示 1v1ORM表示 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 mit() # 事务的最终提交

主表记录插入时,连带子表记录一起插入。

标签:

pythonsqlalchemy(ORM)-02表关系由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“pythonsqlalchemy(ORM)-02表关系