首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在SQLAlchemy中使用关联对象自引用多对多关系

,可以通过使用relationshipsecondary参数来实现。

首先,关联对象自引用多对多关系是指一个表中的记录可以与同一表中的其他记录建立多对多的关系。在SQLAlchemy中,可以使用relationship来定义这种关系。

代码语言:txt
复制
from sqlalchemy import Column, Integer, String, Table
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('entity.id')),
    Column('right_id', Integer, ForeignKey('entity.id'))
)

class Entity(Base):
    __tablename__ = 'entity'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    related_entities = relationship('Entity',
                                    secondary=association_table,
                                    primaryjoin=id==association_table.c.left_id,
                                    secondaryjoin=id==association_table.c.right_id,
                                    backref='related_to')

在上述代码中,Entity类表示实体,其中related_entities字段定义了与其他实体的多对多关系。secondary参数指定了关联表,即association_table,该表用于存储实体之间的关联关系。

使用这种关系,可以通过related_entities字段来访问与当前实体相关联的其他实体。例如,可以通过以下方式获取与实体1相关联的所有实体:

代码语言:txt
复制
entity1 = session.query(Entity).get(1)
related_entities = entity1.related_entities

关于SQLAlchemy中关联对象自引用多对多关系的更多信息,请参考腾讯云的SQLAlchemy文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

hibernate 一一,一关联关系使用

关系型数据库 关系数据库,是建立关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库的数据。现实世界的各种实体以及实体之间的各种联系均用关系模型来表示。...标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行关系数据库数据的检索和操作。 关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。...明显的数据冗余,毕竟关系不用双方存储。 利用mappedBy属性,指明关系由哪一方维护。 一关系处理 创建两个实体对象,分别对应一与的一方。...加上@JoinColumn属性表结构 扩展 双方都设置了关联关系后,进行数据存储模拟 @Test public void contextLoads() { OneObject...先插入的一方数据,然后把one对应的一方关联加进去。 想要避免这种多余sql。有两种方式。 方法一:直接把one对应的一方赋值给的一方。

5.2K20
  • Entity Framework中使用存储过程(五):如何通过存储过程维护关系

    对于数据库设计来说,(或者一)是一种常见的数据关系,比如联系人和地址之间的关系。...我们可以看到,虽然我们选择了三张表,EF能够解析出Contact_Address为关系表,所以最终生成出来的就是我们希望的具有(如果一个联系人只有一个地址,你可以将关系更新成一)。...Entity Framework中使用存储过程(一):实现存储过程的自动映射 Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?...Entity Framework中使用存储过程(三):逻辑删除的实现与增长列值返回 Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?...Entity Framework中使用存储过程(五):如何通过存储过程维护关系

    1.2K110

    SQLAlchemy 数据表关联

    对于使用 SQLAlchemy 建立数据表之间的关系前面的文章 SQLAlchemy 定义关系 已经进行了介绍,今天主要看单个数据表之内的关联。...数据表内的一关系 数据表关联的一关系,典型的就是父亲和子女的关系。我们通过引用父亲的 id 来实现,然后通过反向链接来获取子女的信息。...数据表内关联关系的实例那就更多了,比如完整的关注者和被关注者的关系、python 父类与子类的关系等等。... SQLAlchemy 关系需要借助于关系表来实现,关联关系也同样需要关联表,只是关联关联的是同一个数据表。...,需要通过 relationship 来建立关系两个数据表的关系,只需要指定 secondary 参数为关系表即可,但是关联关系的 followerid 和 follwedid 指向的是同一个数据表的

    3K40

    SqlAlchemy 2.0 中文文档(十三)

    不删除的情况下删除集合涉及将外键列设置为 NULL 以进行一关系,或者删除相应的关联行以进行关系。...对于引用多表的关系,请使用普通的批量插入技术来产生新对象,然后使用 AbstractCollectionWriter.add_all() 将其与集合关联起来。...不删除的情况下移除集合涉及将外键列设置为 NULL(对于 一 关系)或删除相应的关联行(对于 关系)。...ORM 查询指南 - 基本关系模式 集合 对于集合,两个类之间的关系涉及使用 relationship.secondary 参数配置的第三个表的情况。...对于引用多表的关系,请使用普通的批量插入技术来生成新对象,然后使用AbstractCollectionWriter.add_all()将它们与集合关联起来。

    20210

    SqlAlchemy 2.0 中文文档(十一)

    设置双向关系 使用延迟评估形式的“次要”参数 使用集合、列表或其他集合类型进行多表删除行 关联对象关联对象访问模式相结合 延迟评估关系参数...声明后为映射类添加关系 使用的“次要”参数进行延迟评估 邻接列表关系 复合邻接列表 引用查询策略 配置引用急加载 配置关系连接方式 处理多个连接路径...指定备用连接条件 创建自定义外键条件 连接条件中使用自定义运算符 基于 SQL 函数的自定义运算符 重叠的外键 非关系比较 / 材料化路径 引用关系...如果你知道你在做什么,像上面这样使用映射是可以的;很少使用关联对象”模式的情况下使用关系可能是有充分理由的,因为通过单个关系加载关系更容易,这也可以优化“次要”表 SQL 语句中的使用效果...如果知道自己在做什么,使用上述映射是可以的;很少使用关联对象”模式的情况下使用关系可能有充分的理由,因为单个关系中加载关系更容易,这也可以稍微优化“secondary”表 SQL 语句中的使用方式

    20210

    Flask数据库过滤器与查询集

    SQLAlchemy无法自行决定时,指定关系的二级联结条件 如果想为反向引用(backref)定义惰性(lazy)状态,可以使用**backref()**函数: class Person(db.Model...引用关系 关系我们的Web应用可以用来实现用户之间的关注,但是在上面的文章和标签的例子关联表连接的是两个明确的实体,而在用户关注其他用户时,都在users表内,只有一个实体。...如果关系的两侧都在同一个表,这种关系称为引用关系关注关系的左侧是用户实体,称为”关注者”;右侧也是用户实体,称为”被关注者”。...这种用户之间关注的关系,我们依然可以使用上面的方法来实现。 高级关系 引用关系可在数据库中表示用户之间的关注,但却有个限制。使用关系时,往往需要存储所联两个实体之间的额外信息。...这种信息只能存储关联,但是之前实现的学生和课程之间的关系关联表完全是由SQLAlchemy掌控的内部表。

    6.9K10

    SqlAlchemy 2.0 中文文档(十九)

    对于保证具有元素的属性,例如引用相关对象引用,其中引用外键不为 NULL,可以通过使用内连接使查询更有效;这在映射级别通过 relationship.innerjoin 标志可用: class...这种加载样式发出一个 SELECT,该 SELECT 引用对象的主键值,或者关系的情况下引用对象的主键值,以便在 IN 子句中加载相关联关系: >>> from sqlalchemy import...下面的示例说明了关系示例,配置Parent.children关系发出Parent对象的 SELECT 语句时使用 Select IN loading: from typing import...这种加载样式发出一个 SELECT,该 SELECT 引用对象的主键值,或者关系的情况下引用对象的主键值,位于 IN 子句中,以加载相关联关系: >>> from sqlalchemy import...选择 IN 加载还支持关系目前的情况下,它会跨越所有三个表进行 JOIN,以匹配一边到另一边的行。

    25110

    SqlAlchemy 2.0 中文文档(二十七)

    使用显式连接、外连接或Comparator.has()进行更全面的非一标量成员测试。 一个一的上下文中与None进行比较会产生一个 NOT EXISTS 子句。...与标量多相比,关联表的别名也将被呈现,形成查询主体的一部分的自然连接。这不适用于超出简单 AND 比较的查询,例如使用 OR 的查询。...使用显式联接、外联接或 Comparator.has() 结合 not_() 进行更全面的非一标量成员测试。 的情况下与 None 比较会产生 EXISTS 子句。...Comparator.contains() 仅适用于集合,即实现一关系且 uselist=True 的relationship()。...因此,Comparator.contains() 与简单的一操作一起使用时非常有用。 对于操作,Comparator.contains() 的行为有更多注意事项。

    32310

    flask数据操纵

    Flask ORM Django框架内部已经提供ORM这样的框架,来实现对象关系映射,方便我们操作数据库。如果想在Flask也达到这样效果,需要安装一个第三方来支持。...选项 说明 backref 关系的另一模型添加反向引用 primary join 明确指定两个模型之间使用的联结条件 uselist 如果为False,不使用列表,而使用标量值 order_by...指定关系记录的排序方式 secondary 指定记录的排序方式 secondary join SQLAlchemy无法自行决定时,指定关系的二级联结 创建 Flask-SQLAlchemy...# backref:关系的另一模型添加反向引用 heros = db.relationship("Hero", backref='type') # 英雄 class Hero(db.Model...:一一、一关联等。

    1.3K10

    SqlAlchemy 2.0 中文文档(十五)

    仅在关系一侧配置 passive_updates=False 不会产生完全效果,因为工作单元仅在当前标识映射中搜索可能引用具有突变主键的对象,而不是整个数据库搜索。...另请参阅 使用 ORM 相关对象 - SQLAlchemy 统一教程relationship()进行教程介绍 关系配置 - 叙述性文档 参数: argument – 此参数指的是要相关联的类。...另请参阅 - “关系的参考示例。 引用关系 - 引用情况下使用的具体细节。 配置关系 - 使用声明式时的附加选项。...primaryjoin – 将用作子对象与父对象之间的主要连接的 SQL 表达式,或者关系中将父对象连接到关联表。默认情况下,此值基于父表和子表(或关联表)的外键关系计算。...另请参阅 指定替代连接条件 single_parent – 当为 True 时,安装一个验证器,该验证器将阻止对象同时与多个父对象关联。这用于应将一或关系视为一一或一的情况。

    22710

    SqlAlchemy 2.0 中文文档(二十三)

    另请参阅 使用 ORM 关系的外键 ON DELETE 级联 使用删除级联处理关系 delete-orphan 使用删除级联处理关系 cascade="all, delete"选项关系同样有效...### 使用外键 ON DELETE 处理关系 正如在使用级联删除处理关系描述的那样,“删除”级联也适用于关系。...delete-orphan 级联也可以应用于一或一关系,这样当一个对象从其父对象取消关联时,它也会自动标记为删除。...另请参阅 从多表删除行 使用外键 ON DELETE 处理关系 使用 ORM 关系的外键 ON DELETE 级联 SQLAlchemy 的“delete”级联的行为与数据库FOREIGN...关系使用外键 ON DELETE 如使用 delete cascade 与关系所述,“delete”级联也适用于关系

    25510

    Flask_数据库

    关系选项 选项名 说明 backref 关系的另一模型添加反向引用 primary join 明确指定两个模型之间使用的联结条件 uselist 如果为False,不使用列表,而使用标量值 order_by...指定关系记录的排序方式 secondary 指定关系关系表的名字 secondary join SQLAlchemy无法自行决定时,指定关系的二级联结条件 数据库的基本操作 Flask-SQLAlchemy...准备把数据写入数据库前,要先把数据添加到会话,然后调用commit()方法提交会话 Flask-SQLAlchemy,查询操作通过query 对象操作....,第一个是多方模型的类名,第二个定义的关系 # us给一方使用,实现一的查询,backref 给多方使用,实现一的查询 #repr()方法显示一个可读字符串 def __...,设定secondary 关联 tb_user_follows = db.Table( "tb_user_follows", db.Column('follower_id'

    1.3K50

    SqlAlchemy 2.0 中文文档(三十)

    此外,如果检测到表是两个其他表之间的纯关联表,则不会直接映射该表,而是将其配置为两个引用表的映射之间的多表。...由于我们正在检查的 ForeignKeyConstraint 对应于来自直接映射类的引用,因此关系将被设置为指向引用类的关系引用类上将创建相应的一个反向引用引用此类。...此外,如果检测到表是两个其他表之间的纯关联表,则不会直接映射,而是将其配置为两个引用表的映射之间的多表。...由于我们正在检查的ForeignKeyConstraint对应于从直接映射类的引用,该关系将被设置为指向被引用类的关系;在被引用的类上将创建一个相应的一反向引用,指向该类。...通常情况下,如果任何一侧都没有关联,则AutomapBase.prepare()会在“一”一侧产生一个relationship(),并使用relationship.backref参数将其与另一侧匹配

    27310

    盘点Flask与数据库的交互插件--Flask-Sqlalchemy

    前言 我们做web开发的时候,经常需要用到与数据库交互,因为我们的数据通常都是保存在数据库的,如果有人需要访问,就必须与数据库访问,所以今天我们介绍一个Flask与数据库交互的插件---Flask-Sqlalchemy...__name__,self.name) 2).一 我们需要建立一个主表和一个子表,分别命名为“father”和‘son’,然后需要建立外键和反射来互相引用建立一种关系,我们来看看: class father...db.relationship('son',backref='fa',lazy='dynamic') # lazy表示加载方式: # dynamic:动态加载,只有用到了才加载 只可以用在一关系...__repr__() 3).一 就是将反射应用在子表上,与父表同时进行关联。...__name__,self.name) 4). 设置一个关联表来两个表同时进行管理。

    2.5K60

    SqlAlchemy 2.0 中文文档(七十八)

    ORM 至少版本 0.4 以来就包含了这样的行为,即一个“挂起”的对象,意味着它与Session相关联,但尚未插入数据库,当它变成“孤儿”时,即已与引用它的父对象解除关联,并且配置的relationship...行为变更适用于被多种父对象引用并且每个父对象都指定了delete-orphan的对象;典型示例是模式中桥接两种其他对象关联对象。...行为变化适用于被多种父对象引用并且每个父对象都指定delete-orphan的对象;典型示例是模式连接两种其他对象关联对象。...ORM 至少 0.4 版本以来已经包含了这样的行为,即一个“待定”对象,意味着它与Session相关联,但尚未插入到数据库,当它成为“孤儿”时,即已经与引用它的父对象解除关联,并且配置的relationship...行为变更适用于被多种类型父对象引用对象,每种类型父对象都指定delete-orphan;典型示例是模式中桥接两种其他对象关联对象

    15210

    SqlAlchemy 2.0 中文文档(七十三)

    #4351 关联代理现在强引用对象 关联代理集合仅维护对象的弱引用的长期行为被还原;代理现在将在代理集合本身也在内存的情况下维护对象的强引用,从而消除“stale association proxy...#4359 ### 一替换不会对“raiseload”或“old”对象引发异常 考虑到延迟加载将继续关系上进行,以加载“old”值,如果关系未指定 relationship.active_history...#4351 关联代理现在强引用对象 长期以来,关联代理集合仅保持对象的弱引用的行为被恢复;代理现在将保持对象的强引用,只要代理集合本身也在内存,消除了“过时的关联代理”错误。...#4351 关联代理现在强引用对象 关联代理集合长期以来只维护对象的弱引用的行为被还原;代理现在将在代理集合本身也在内存的情况下维护对象的强引用,消除了“过时的关联代理”错误。...#4351 关联代理现在强引用对象 关联代理集合长期维持对象的弱引用的行为被撤销;代理现在将在代理集合本身也在内存的情况下维持对象的强引用,消除了“过时的关联代理”错误。

    20510

    Python Web - Flask笔记6

    ORM关系以及一: mysql级别的外键,还不够ORM,必须拿到一个表的外键,然后通过这个外键再去另外一张表查找,这样太麻烦了。...一一的关系sqlalchemy,如果想要将两个模型映射成一一的关系,那么应该在父模型,指定引用的时候,要传递一个uselist=False这个参数进去。...关系关系需要通过一张中间表来绑定他们之间的关系。...两个需要做的模型随便选择一个模型,定义一个relationship属性,来绑定三者之间的关系使用relationship的时候,需要传入一个secondary=中间表。...父删子删 delete-orphan:表示当一个ORM对象解除了父表关联对象的时候,自己便会被删除掉。当然如果父表的数据被删除,自己也会被删除。

    2K10
    领券