Sqlalchemy中relationship的理解
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,"指向"即定义一张表中的数据条目指向另一张表中的条目,建立这种有向的"指向"可以让表以字段的方式查询到被指向的条目(们),所以,如果要双向查询,就需要双向指向。One To Many在"多"方表中添加
千家信息网最后更新 2025年01月24日Sqlalchemy中relationship的理解
"指向"
即定义一张表中的数据条目指向另一张表中的条目,建立这种有向的"指向"可以让表以字段的方式查询到被指向的条目(们),所以,如果要双向查询,就需要双向指向。
One To Many
在"多"方表中添加"一"方的id作为ForeignKey约束,为查询方便双方均需要定义relationship()字段;
class Parent(Base):__tablename__ = 'parent'id = Column(Integer, primary_key=True)children = relationship("Child", back_populates="parent")class Child(Base):__tablename__ = 'child'id = Column(Integer, primary_key=True)parent_id = Column(Integer, ForeignKey('parent.id'))parent = relationship("Parent", back_populates="children")
One To One
与One To Many区别不大,只要"一"方的relationship方法中添加一个"uselist=False"参数即可,uselist是一个标量属性(a scalar attribute),其含义是"一"方对应另一张表的条目不使用列表。
class Parent(Base):__tablename__ = 'parent'id = Column(Integer, primary_key=True)child = relationship("Child", uselist=False, back_populates="parent")class Child(Base):__tablename__ = 'child'id = Column(Integer, primary_key=True)parent_id = Column(Integer, ForeignKey('parent.id')) # 多方才有这个字段parent = relationship("parent", back_populates="child") # 通常也会把backref用函数表示天机uselist=False参数,用以显示指出。 # parent = rlationship("parent", backref=backref("child", uselist=False))
Many To Many
借助中间表完成,利用relationship支持的secondary参数,
association_table = Table('association', Base.metadata, Column('left_id', Integer, ForeignKey('left.id')), Column('right_id', Integer, ForeignKey('right.id')) ) class Parent(Base): __tablename__ = 'left' id = Column(Integer, primary_key=True) children = relationship("Child", secondary=association_table, back_populates="parents")class Child(Base): __tablename__ = 'right' id = Column(Integer, primary_key=True) parents = relationship("Parent", secondary=association_table, back_populates="children")
注意,secondary可以接受'a callable that returns the ultimate argument,which is evaluated only when mappers are first used."即接受可执行参数,可以让association_table 在稍晚的时候定义,甚至可以在所有模块都初始化完成后,直到它可调用为止。
class parent(Base): __tablename__ = "left" id = Column(Integer, primary_key=True) children = relationship("Child", secondary=lambda: assciation_table, backref="parents")
以上relationship参数的表明均可以用类名字符串代替。
删除Mang To Many记录,不必手动删除secondary的中间表数据,数据库会根据"cascade rule"级联规则自动删除。
如果中间表对象需要被调用
class Association(Base): __tablename__ = 'association' left_id = Column(Integer, ForeignKey('left.id'), primary_key=True) right_id = Column(Integer, ForeignKey('right.id'), primary_key=True) extra_data = Column(String(50)) child = relationship("Child", back_populates="parents") parent = relationship("Parent", back_populates="children")class Parent(Base): __tablename__ = 'left' id = Column(Integer, primary_key=True) children = relationship("Association", back_populates="parent")class Child(Base): __tablename__ = 'right' id = Column(Integer, primary_key=True) parents = relationship("Association", back_populates="child") # create parent, append a child via associationp = Parent()a = Association(extra_data="some data")a.child = Child()p.children.append(a)# iterate through child objects via association, including association# attributesfor assoc in p.children: print(assoc.extra_data) print(assoc.child)
# 寻找答案的路途上要保持耐心和专心!
需要注意:back_populates参数赋值参数一定不能是relationship第一个参数的字段,那样相当于被对应关系表中有了重复字段。
参数
字段
指向
条目
数据
查询
双向
耐心
不大
函数
双方
含义
天机
字符
字符串
对象
属性
手动
数据库
方式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发收文科生吗
我的世界服务器老断线
网络安全宣传单.doc
数院有软件开发研究
对象存储安全软件开发
数据库恢复为什么不能完全恢复
慧享网络技术有限公司
组合式网络技术
锦州有计算机网络技术吗
找软件开发公司武汉
安徽币友网络技术有限公司
网络安全的句子或古诗
云数据库架构技术
男士软件开发送什么礼物
公寓网络技术总结
嵌入式软件开发工程师招聘猎聘
数据库缓冲器
打开核磁数据库
魔兽国服一区服务器
数据库3v
通俗点什么是云服务器
山东软件开发解决方案推荐
软件开发质量控制岗
数据库更改登录方式
网络安全法正式实施图片
西安华募天采网络技术有限公司
国际数据库会议
网络安全和linux
优姿互联网科技有限公司
渭南市网络安全应急指挥中心