Sqlalchemy中relationship的理解
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,"指向"即定义一张表中的数据条目指向另一张表中的条目,建立这种有向的"指向"可以让表以字段的方式查询到被指向的条目(们),所以,如果要双向查询,就需要双向指向。One To Many在"多"方表中添加
千家信息网最后更新 2024年09月22日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安全错误
数据库的锁怎样保障安全
网络安全教育小短剧
mysql数据库何为数据
服务器共享硬盘怎么显示内存
护苗网络安全课堂之2
北京专业的软件开发方案
互联网科技灰犀牛
dz论坛数据数据库文件夹
35岁软件开发
网络安全勒索软件详解
大转盘数据库设计
sql 查询数据库用户
把云服务器停掉了还会被黑吗
网络安全 政策导向
重庆专业服务器租用云主机
php数据库连接编码问题
数据库的内模式外模式
河北万安软件开发
呋喃丹犀互联网科技有限公司
数据库创建数据表的语言
江苏运营网络技术要多少钱
用友烟草软件开发公司怎么样
机房网络安全岗位安全制度
电气自动化和计算机网络技术
如何增加wi-fi网络安全性
西门子数据库有什么用
神武2手游最新服务器
zen3能做服务器吗
服务器cpu e5
数据库锁表原因
互联网络科技公司名