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

如何在SQLAlchemy ORM上实现自引用多对多关系,并引用相同的属性?

在SQLAlchemy ORM中实现自引用多对多关系,并引用相同的属性,可以通过以下步骤实现:

  1. 定义模型类:首先,需要定义一个模型类来表示数据库中的表。在这个模型类中,我们需要定义一个多对多关系,并引用相同的属性。例如,我们可以创建一个名为User的模型类来表示用户,其中包含一个自引用的多对多关系friends,并引用相同的属性name
代码语言:python
代码运行次数:0
复制
from sqlalchemy import Column, Integer, String, Table, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

friends_association_table = Table('friends_association', Base.metadata,
    Column('user_id', Integer, ForeignKey('users.id')),
    Column('friend_id', Integer, ForeignKey('users.id'))
)

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    friends = relationship('User', secondary=friends_association_table,
                           primaryjoin=id==friends_association_table.c.user_id,
                           secondaryjoin=id==friends_association_table.c.friend_id,
                           backref='friends')
  1. 创建数据库会话:接下来,我们需要创建一个数据库会话来操作数据库。可以使用SQLAlchemy提供的Session类来创建会话。
代码语言:python
代码运行次数:0
复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('数据库连接字符串')
Session = sessionmaker(bind=engine)
session = Session()
  1. 创建表:在使用模型类之前,需要先创建数据库表。可以使用Base.metadata.create_all(engine)方法来创建所有定义的模型类对应的表。
代码语言:python
代码运行次数:0
复制
Base.metadata.create_all(engine)
  1. 使用模型类:现在,我们可以使用定义的模型类来操作数据库了。例如,我们可以创建几个用户并建立他们之间的关系。
代码语言:python
代码运行次数:0
复制
# 创建用户
user1 = User(name='User 1')
user2 = User(name='User 2')
user3 = User(name='User 3')

# 建立关系
user1.friends.append(user2)
user1.friends.append(user3)
user2.friends.append(user3)

# 提交到数据库
session.add_all([user1, user2, user3])
session.commit()
  1. 查询数据:可以使用会话对象来查询数据。例如,我们可以查询某个用户的朋友列表。
代码语言:python
代码运行次数:0
复制
# 查询用户的朋友列表
user = session.query(User).filter_by(name='User 1').first()
friends = user.friends

for friend in friends:
    print(friend.name)

这样,我们就实现了在SQLAlchemy ORM上实现自引用多对多关系,并引用相同的属性。在实际应用中,可以根据具体需求进行适当调整和扩展。

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

相关·内容

SqlAlchemy 2.0 中文文档(十九)

对于保证具有元素属性,例如引用相关对象引用,其中引用外键不为 NULL,可以通过使用内连接使查询更有效;这在映射级别通过 relationship.innerjoin 标志可用: class...提示 在所有情况下,SQLAlchemy ORM 不会覆盖已加载属性和集合,除非有指示要这样做。由于正在使用一个身份映射,通常情况下,ORM 查询返回对象实际已经存在加载到内存中。...对于保证具有元素属性,例如对一个相关对象引用,其中引用外键不为 NULL,通过使用内连接可以使查询更有效率;这可以通过映射级别的relationship.innerjoin标志来实现: class...一些数据库, Oracle, IN 表达式大小有硬限制,总体,SQL 字符串大小不应该是任意大。...提示 在所有情况下,除非有明确指示要这样做,否则 SQLAlchemy ORM 不会覆盖已加载属性和集合。由于正在使用标识映射,通常情况下,ORM 查询返回对象实际已经存在加载到内存中。

18410

SqlAlchemy 2.0 中文文档(十一)

在声明后为映射类添加关系 使用“次要”参数进行延迟评估 邻接列表关系 复合邻接列表 引用查询策略 配置引用急加载 配置关系连接方式 处理多个连接路径...指定备用连接条件 创建自定义外键条件 在连接条件中使用自定义运算符 基于 SQL 函数自定义运算符 重叠外键 非关系比较 / 材料化路径 引用关系...(One To One) 一一(One To One)在外键视角本质是一(One To Many)关系,但表示任何时候只会有一行引用特定父行。...另请参阅 删除 使用 ORM 关系外键 ON DELETE 级联 删除孤儿 一在父表中放置了一个引用子表外键。...使用集合、列表或其他集合类型进行关系 对于关系集合配置与一完全相同使用集合、列表或其他集合类型进行一关系中所述。

14310
  • SqlAlchemy 2.0 中文文档(十五)

    另请参阅 - “关系参考示例。 引用关系 - 在引用情况下使用具体细节。 配置关系 - 在使用声明式时附加选项。...()`-绑定属性还提供了一些 SQL 构造实现,这些实现旨在根据相关对象特定实例来过滤`relationship()`-绑定属性,它可以从给定持久(或较少见分离)对象实例中解包适当属性值,构造...,对象有一个特定父对象 - with_parent() 函数生成一个比较,返回由给定父对象引用行,这与使用==运算符与一方面基本相同: >>> from sqlalchemy.orm import...,对象有一个特定父对象 - with_parent()函数生成一个比较,返回被给定父对象引用行,这本质与使用一多方==运算符相同: >>> from sqlalchemy.orm import...,对象有一个特定父对象 - with_parent() 函数生成一个比较,返回由给定父对象引用行,这与使用==运算符与一方面基本相同: >>> from sqlalchemy.orm import

    14810

    SqlAlchemy 2.0 中文文档(三十)

    由于我们正在检查 ForeignKeyConstraint 对应于来自直接映射类引用,因此关系将被设置为指向引用关系;在引用类上将创建相应一个反向引用引用此类。...覆盖逻辑与一/相同;在调用 generate_relationship() 函数生成结构后,现有属性将被保留。...由于我们正在检查ForeignKeyConstraint对应于从直接映射类引用,该关系将被设置为指向被引用关系;在被引用类上将创建一个相应反向引用,指向该类。...对于覆盖逻辑与一/逻辑相同;调用generate_relationship() 函数来生成结构,已存在属性将被保留。...对于覆盖逻辑与一/逻辑相同;调用 generate_relationship() 函数来生成结构,并将保留现有属性

    19110

    SqlAlchemy 2.0 中文文档(五十五)

    编写此查询更好方式是使用适用于任何其他引用关系相同模式,即显式使用aliased()构造。...### 对于关系,delete-orphan 级联通常仅在一关系“一”侧配置,而不在一或关系”侧配置。...编写此查询更好方法是使用适用于任何其他引用关系相同模式,即显式使用aliased()构造。...当此错误意外发生时,通常是因为在响应于对于关系 ,delete-orphan 级联通常仅在一关系“一”侧配置,而不在一或关系”侧配置。...另请参阅 对于关系,删除孤立节点级联通常仅在一关系“一”侧配置,并不在一或关系”侧配置。 ### 关系 X 将列 Q 复制到列 P,与关系‘Y’存在冲突。

    32710

    SqlAlchemy 2.0 中文文档(十二)

    另请参阅 此部分详细说明了引用关系单表版本。有关使用第二个表作为关联表引用关系,请参阅引用关系部分。...()配置与“正常”关系工作方式相同,唯一例外是,“方向”,即关系是一还是一,默认假定为一。...基本,当foreign()和remote()在相同比较表达式一侧时,关系被视为“一”;当它们在不同一侧时,关系被视为“一”。...这意味着虽然只读关系可能引用一个可变 Python 集合,列表或集合,但对该列表或集合进行更改,如在映射实例存在那样, ORM 刷新过程没有影响。...基本,当foreign()和remote()在相同比较表达式一侧时,关系被认为是“一”;当它们在不同一侧时,关系被认为是“一”。

    14810

    SqlAlchemy 2.0 中文文档(二十三)

    另见 从多表中删除行 使用外键 ON DELETE 与关系 ### 使用 ORM 关系外键 ON DELETE 级联 SQLAlchemy “delete”级联行为与数据库FOREIGN...### 使用外键 ON DELETE 处理关系 使用级联删除处理关系 中所述,“delete”级联也适用于关系。...另请参阅 从多表中删除行 使用外键 ON DELETE 处理关系 使用 ORM 关系外键 ON DELETE 级联 SQLAlchemy “delete”级联行为与数据库FOREIGN...在关系中使用外键 ON DELETE 使用 delete cascade 与关系所述,“delete”级联也适用于关系。...同样,如果对象通过另一个对象一或一引用,则该引用也将保留在该对象,直到该对象也过期为止。

    19510

    SqlAlchemy 2.0 中文文档(三十三)

    类仪器化是指 ORM 如何将属性放在类,以维护数据跟踪该数据更改,以及安装在类事件钩子。 注意 该扩展包是为了与其他已经执行自己仪器化对象管理包集成而提供。它不适用于一般用途。...,其中一个中介类在两个以模式关联类之间进行关系中介。...### 属性检测 演示 SQLAlchemy 属性管理系统修改示例。 文件列表: listen_for_events.py - 演示如何将事件附加到所有被检测属性监听更改事件。...helloworld.py - 演示如何加载一些数据,缓存结果。 relationship_caching.py - 演示如何在关系端点添加缓存选项,以便延迟加载从缓存加载。...helloworld.py - 演示如何加载一些数据,缓存结果。 relationship_caching.py - 演示如何在关系端点添加缓存选项,以便延迟加载从缓存加载。

    23910

    SqlAlchemy 2.0 中文文档(七十八)

    行为变更适用于被多种父对象引用并且每个父对象都指定了delete-orphan对象;典型示例是在模式中桥接两种其他对象关联对象。...#2397 single_parent警告现在变成了错误 一个relationship(),它是一或关系指定“cascade=‘all, delete-orphan’”,这是一个尴尬但仍然支持用例...然而,实现从未合理,迫使在单位操作期间发生昂贵对象扫描 ORM 使用方式。...#2397 single_parent警告现在是错误 一个relationship(),它是一或关系指定了“cascade=’all, delete-orphan’”,这是一个尴尬但仍然支持用例...#2397 single_parent警告现在变成了错误 一个relationship(),它是一或关系指定“cascade=‘all, delete-orphan’”,这是一个尴尬但仍然支持用例

    8010

    SqlAlchemy 2.0 中文文档(六)

    其他 ORM 属性 relationship(),也可以通过在目标类生成用户定义类方法来生成,并且这些类方法也使用了 declared_attr 装饰器进行修饰。...上面的例子演示了通过生成一个 relationship() 到一个名为 LogRecord 映射对象来实现此功能。...下面是一个示例,其中结合了外键列和关系,以便两个类Foo和Bar都可以通过多引用到一个公共目标类: from sqlalchemy import ForeignKey from sqlalchemy.orm...下面是一个示例,将外键列和关系组合在一起,以便两个类Foo和Bar都可以配置为通过多引用一个共同目标类: from sqlalchemy import ForeignKey from sqlalchemy.orm...然而,在这种情况下,我们可能希望在每个表都有一个id列,通过外键引用它们。

    25510

    SqlAlchemy 2.0 中文文档(八十一)

    引用和循环贪婪加载 由于我们别名技术已经改进,relation() 可以沿着相同表进行任意次数连接;您告诉它您想要深入深。...引用和循环贪婪加载 由于我们别名技术已经改进,relation()可以沿着相同表任意次数连接;你告诉它你想要深。...引用和循环贪婪加载 由于我们别名技术已经提高,relation()可以沿着同一张表任意次数进行连接;您告诉它您想要深。...外部解除引用超出范围实例将自动从会话中移除。但是,具有“脏”更改项目将保持强引用,直到这些更改被刷新,此时对象将恢复为弱引用(这适用于“可变”类型,可选属性)。...外部解除引用超出范围实例会自动从会话中移除。但是,具有“脏”更改项目将保持强引用,直到这些更改被刷新,此时对象将恢复为弱引用(这适用于‘可变’类型,可选属性)。

    7810

    SqlAlchemy 2.0 中文文档(三)

    在 声明映射类 部分,映射类示例使用了一种称为 relationship() 构造。此构造定义了两个不同映射类之间链接,或者从一个映射类到它自身,后者称为引用关系。...类 关系,沿着 User.addresses 关系;user_account 表中一个特定行可能被 address 表中多行引用。...所有一关系自然对应于另一个方向关系,在本例中由Address.user指出。...,不会执行冗余工作;由于 u1.addresses 集合被刷新,根据身份映射,这些实际是我们已经处理过a1和a2象中相同Address实例,因此我们已经完成了加载这个特定对象图中所有属性:...] (1, 2, 3, 4, 5, 6) lazy="raise_on_sql"选项也试图关系变得更加智能;在上面的例子中,如果Address对象Address.user属性未加载

    28120

    SqlAlchemy 2.0 中文文档(五十八)

    作为此更改一部分,lazy="immediateload" 策略现在以与其他急加载器相同方式尊重 relationship.join_depth 参数进行引用急加载,其中将其设置为未设置或设置为零将导致引用即时加载不会发生...关系绑定属性名称时失败,引发AttributeError(#8996)。...,它允许单个加载器选项自动递归到引用关系中。...这将在尽可能情况下呈现,返回未过滤结果集,但不支持具有特定列呈现要求参数“ORM 批量 INSERT”语句。...作为这一变化一部分,lazy="immediateload"策略现在以与其他急切加载器相同方式尊重relationship.join_depth参数用于引用急切加载,其中将其未设置或设置为零将导致引用

    9110

    SqlAlchemy 2.0 中文文档(七十七)

    这是通过在刷新过程中排除属性实现。然而,直到现在,属性更改仍然会将父对象标记为“脏”,触发潜在刷新。改变是viewonly标志现在也阻止为目标属性设置历史记录。...相反,防止由于相互依赖反向引用处理程序而导致无限递归系统已经移动到了 ORM 反向引用事件处理程序中,这些处理程序现在负责确保相互依赖事件链(例如向集合 A.bs 追加,响应中设置属性 B.a...这是通过在刷新过程中排除属性实现。然而,直到现在,属性更改仍然会将父对象标记为“脏”,触发潜在刷新。更改是viewonly标志现在还阻止为目标属性设置历史记录。...这是通过在刷新过程中不考虑该属性实现。然而,直到现在,属性更改仍会将父对象注册为“脏”,触发潜在刷新。改变是,viewonly标志现在也阻止为目标属性设置历史记录。...相反,为了防止由于相互依赖反向引用处理程序而导致无限递归,现在将这一系统移动到了 ORM 反向引用事件处理程序中,这些处理程序现在负责确保一系列相互依赖事件(例如向集合 A.bs 追加,在响应中设置属性

    12910

    SqlAlchemy 2.0 中文文档(四)

    查询指南 SQLAlchemy ORM 原文:docs.sqlalchemy.org/en/20/orm/index.html 在这里,介绍完整描述了对象关系映射器。...所有 ORM 映射类都要求至少声明一个列作为主键一部分,通常是通过在那些应该成为主键mapped_column()对象使用Column.primary_key参数来实现。...所有的 ORM 映射类都需要至少声明一个列作为主键一部分,通常是通过在应该成为键那些mapped_column()对象使用Column.primary_key参数来实现。...要了解 SQLAlchemy 实现对象关系映射概念,请先查看 SQLAlchemy 统一教程,在使用 ORM 声明形式定义表元数据中介绍。...在现代 SQLAlchemy 中,这些风格之间差异基本是表面的;当使用特定 SQLAlchemy 配置风格来表达映射类意图时,映射类内部映射过程大部分都是相同,最终结果始终是一个用户定义

    16310

    SqlAlchemy 2.0 中文文档(二十五)

    另请参见 relationship.load_on_pending - 此标志允许在待处理项目一进行每关系加载。...仅当属性容器 active_history 标志设置为 True 时,才无条件地在 set 时获取“旧”值。这个标志通常设置为主键属性和不是简单标量对象引用。...在目标对象修改与关系绑定属性可能不会触发反向引用事件,如果有效值已从保存外键值中加载,则是如此。...另请参见 relationship.load_on_pending - 此标志允许在待处理项目关系进行逐个加载。...只有当属性容器 active_history 标志设置为 True 时,才无条件地在设置时获取“旧”值。此标志通常设置为主键属性和非简单一标量对象引用

    15410
    领券