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

如何在SQLAlchemy中按混合属性对具有两次对同一表的引用的一对一关系进行排序?

在SQLAlchemy中,可以使用relationship函数来定义模型之间的关系。对于具有两次对同一表的引用的一对一关系,可以使用foreign_keys参数来指定外键关系。然后,可以使用order_by参数来对关系进行排序。

下面是一个示例代码:

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

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    address_id = Column(Integer, ForeignKey('addresses.id'))
    billing_address_id = Column(Integer, ForeignKey('addresses.id'))

    address = relationship("Address", foreign_keys=[address_id])
    billing_address = relationship("Address", foreign_keys=[billing_address_id])

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    street = Column(String)
    city = Column(String)
    state = Column(String)

# 在查询时,可以使用order_by参数对关系进行排序
users = session.query(User).order_by(User.address_id, User.billing_address_id).all()

在上面的示例中,User模型具有两个对Address表的引用:addressbilling_address。通过在relationship函数中使用foreign_keys参数指定外键关系,可以确保正确的关系建立。然后,在查询时,可以使用order_by参数对关系进行排序。

请注意,上述示例中的代码仅用于演示目的,实际使用时需要根据具体情况进行调整。关于SQLAlchemy的更多详细信息和用法,请参考SQLAlchemy官方文档

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

相关·内容

SqlAlchemy 2.0 中文文档(三十二)

,而不是从数据库初始加载,并要求在加载时列表进行排序。...“混合”意味着属性在类级别和实例级别具有不同行为。 hybrid 扩展提供了一种特殊形式方法装饰器,并且 SQLAlchemy 其余部分具有最小依赖性。...这样做原因是为了在返回结构中保留其他类级别属性文档字符串和混合属性本身引用,而不对传入原始比较器对象进行任何修改。...这样做原因是为了在返回结构中保留其他类级别属性文档字符串和混合属性本身引用,而不对传入原始比较器对象进行任何修改。...这样做原因是为了在返回结构中保持其他类级别属性文档字符串和混合本身引用),而不对传入原始 SQL 表达式进行任何修改。

32610
  • SqlAlchemy 2.0 中文文档(六)

    属性还可以被分配到MetaData集合上,以便单个基类和/或registry在每个映射层次结构上进行影响。...下面是一个示例,其中结合了外键列和关系,以便两个类Foo和Bar都可以通过多引用到一个公共目标类: from sqlalchemy import ForeignKey from sqlalchemy.orm...## 使用混合和基类进行映射继承模式 在处理映射类继承层次结构记录映射器继承模式时,当使用 declared_attr 时,可以使用一些附加功能,无论是与混合类一起使用,还是在类层次结构增加映射和未映射超类时...下面是一个示例,将外键列和关系组合在一起,以便两个类Foo和Bar都可以配置为通过多引用一个共同目标类: from sqlalchemy import ForeignKey from sqlalchemy.orm...与在使用declared_attr时处理__tablename__和其他特殊名称方式相反,当我们混合列和属性(例如关系、列属性等)时,该函数仅在层次结构基类调用,除非与declared_attr.cascading

    35310

    SqlAlchemy 2.0 中文文档(四)

    混合使用关系 在 _orm.column_property() 和其他 _orm.MapperProperty 类混合使用 使用混合和基类进行映射继承模式 使用 _orm.declared_attr...具有命令式表声明式(又名混合声明式) - 不是单独指定表名和属性,而是将显式构建 Table 对象与以其他方式进行声明式映射类关联。...这两种配置样式分别在具有映射列声明性表格和具有命令式表格声明性(又名混合声明性)呈现。...这两种配置样式在使用 mapped_column() 进行声明性表配置和具有命令式表声明式(也称为混合声明式)中介绍。...映射类、实例和映射器运行时内省 使用 registry 进行映射类还将具有一些所有映射共同属性: __mapper__ 属性引用与该类关联 Mapper: mapper = User.

    23910

    SqlAlchemy 2.0 中文文档(十一)

    在声明后为映射类添加关系 使用多“次要”参数进行延迟评估 邻接列表关系 复合邻接列表 自引用查询策略 配置自引用急加载 配置关系连接方式 处理多个连接路径...viewonly 关系参数注意事项 在 Python 中进行突变,包括具有 viewonly=True 反向引用不适用 viewonly=True 集合 / 属性直到过期才重新查询...使用集合(Sets)、列表(Lists)或其他集合类型进行关系 为多关系配置集合方式与一多完全相同,如在使用集合(Sets)、列表(Lists)或其他集合类型进行关系描述那样。...使用集合、列表或其他集合类型进行关系 对于多关系集合配置与一多完全相同,使用集合、列表或其他集合类型进行关系中所述。...该扩展允许配置属性,这些属性将通过单个访问实现两次“跳跃”,一次是到关联对象,另一次是到目标属性。 另请参阅 关联代理 - 允许在三类关联对象映射中在父对象和子对象之间直接进行“多多”样式访问。

    19110

    Flask数据库过滤器与查询集

    ( -属性名).limit(num) 属性排序,取limit(num) 升序排列;属性排序,取limit(num) 降序排列 cls.query.groupby() 原查询分组,返回新查询 查询执行函数...) uselist:如果设为Fales,表示一对关系 order_by:指定关系记录排序方式 secondary:指定多关系关系名字 secondaryjoin:SQLAlchemy无法自行决定时...一关系一对关系至少有一侧是单个实体,所以记录之间联系可以通过外键来实现,让外键指向这个实体。...自引用关系关系在我们Web应用可以用来实现用户之间关注,但是在上面的文章和标签例子,关联表连接是两个明确实体,而在用户关注其他用户时,都在users表内,只有一个实体。...如果关系两侧都在同一个表,这种关系称为自引用关系。在关注关系左侧是用户实体,称为”关注者”;右侧也是用户实体,称为”被关注者”。

    6.9K10

    Python Web - Flask笔记6

    ORM关系以及一多: mysql级别的外键,还不够ORM,必须拿到一个表外键,然后通过这个外键再去另外一张表查找,这样太麻烦了。...一对关系: 在sqlalchemy,如果想要将两个模型映射成一对关系,那么应该在父模型,指定引用时候,要传递一个uselist=False这个参数进去。...多关系: 多关系需要通过一张中间表来绑定他们之间关系。...在两个需要做多模型随便选择一个模型,定义一个relationship属性,来绑定三者之间关系,在使用relationship时候,需要传入一个secondary=中间表。...三种排序 order_by:可以指定根据这个表某个字段进行排序,如果在前面加了一个-,代表是降序排序

    2K10

    SqlAlchemy 2.0 中文文档(十五)

    这两种用例是: 一个表包含自身外键,而且单个行将具有指向其自身主键外键值。 两个表都包含另一个表外键引用,每个表一行引用另一个表另一行。...该选项目的通常是性能之一,因为内连接通常比外连接执行得更好。 当关系引用通过不可为空本地外键引用对象时,或者引用一对一或保证具有一个或至少一个条目的集合时,可以将此标志设置为True。...这用于应将多一或多关系视为一对一或一情况。除了指定delete-orphan级联选项一或多关系外,其使用是可选。...True 另请参阅 一对关系 - 介绍了“一对一”关系模式,通常涉及relationship.uselist备用设置。...使用 SQL 表达式 ORM 批量插入 遗留会话批量插入方法 ORM“upsert”语句 主键进行 ORM 批量更新 为具有多个参数集 UPDATE 语句禁用主键进行

    21610

    SqlAlchemy 2.0 中文文档(三十一)

    在声明式“内联”样式定义 ORM 映射属性进行类型推断,例如上面示例 User 类 id 和 name 属性。...method sort(**kw: Any) → None 将列表升序排序并返回 None。 排序是原地进行(即列表本身被修改)并且稳定(即保持两个相等元素顺序不变)。...如果给定了键函数,则将其应用于每个列表项一次,并根据其函数值升序或降序它们进行排序。 反转标志可以设置为降序排序。...method sort(**kw: Any) → None 将列表升序排序并返回 None。 排序是原地进行(即列表本身被修改)并且稳定(即保持两个相等元素顺序不变)。...如果给定了键函数,则将其应用于每个列表项一次,并根据其函数值升序或降序它们进行排序。 反转标志可以设置为降序排序

    36620

    SqlAlchemy 2.0 中文文档(七十四)

    这是通过在每次调用@getter、@setter以及所有其他变异器方法(@expression)中将混合对象复制到新对象来实现,从而保持先前混合属性定义不变。...注意 这种@hybrid_property更改意味着,当向@hybrid_property添加 setter 和其他状态时,方法必须保留原始混合名称,否则具有附加状态混合将作为不匹配名称存在于类...注意 @hybrid_property这种变化意味着,当向@hybrid_property添加 setter 和其他状态时,方法必须保留原始混合属性名称,否则具有附加状态混合属性将以不匹配名称存在于类...这是通过在每次调用 @getter、@setter 以及所有其他修改器方法( @expression)中将混合对象复制到一个新对象来实现,从而保持先前混合属性定义不变。...注意 这种 @hybrid_property 更改意味着,当向 @hybrid_property 添加 setter 和其他状态时,方法必须保留原始混合属性名称,否则新带有额外状态混合属性将以不匹配名称存在于类

    25610

    SqlAlchemy 2.0 中文文档(八)

    对于引用从多关系链接column_property(),使用and_()将关联表字段与关系两个表连接起来: from sqlalchemy import and_ class Author...对于引用来自多关系 column_property(),使用 and_() 来将关联表字段连接到关系两个表: from sqlalchemy import and_ class Author...例如,这可以允许一个复合列引用一个一关系。 active_history=False – 当为 True 时,表示替换时标量属性“上一个”值应加载,如果尚未加载。...例如,这可以允许一个复合属性引用到一个多关系。 active_history=False – 当为True时,指示在替换时应加载标量属性“先前”值,如果尚未加载。...例如,这可以允许一个复合属性引用到一个多关系。 active_history=False – 当为True时,指示在替换时应加载标量属性“先前”值,如果尚未加载。

    19810

    SqlAlchemy 2.0 中文文档(七十五)

    这种变化不会影响通常情况下将多关系属性与对象进行比较情况,这种情况会被单独处理: >>> # Address.user refers to the User mapper, so >>> # this...在属性操作期间,先前引用对象位置现在使用数据库提交外键值,而不是当前外键值。修复主要效果是,当进行一更改时,向集合发出反向引用事件将更准确地触发,即使在之前手动将外键属性移动到新值。...>>> q = s.query(Address).filter(Address.user == some_user) #3321 新可索引 ORM 扩展 可索引 扩展是混合属性功能扩展,它允许构建引用特定元素属性...#3630 在继承映射器上具有相同名称关系不再发出警告 在继承情景创建两个映射器时,在两者上放置具有相同名称关系将发出警告:“关系’‘在映射器上取代了继承映射器’'上相同关系;这可能会在刷新时引起依赖问题...在 1.0 系列 ResultProxy 系统进行了一系列改进,作为 #918 一部分,它重新组织了内部,使游标绑定结果列与表/ORM 元数据位置匹配,而不是名称匹配,用于包含有关要返回结果行完整信息编译

    29810

    SqlAlchemy 2.0 中文文档(五十五)

    SQLAlchemy 2.0 系列数据类功能未正确遵守这一行为;相反,非数据类混合类和超类上属性将被视为最终数据类配置一部分。...否则,由于它们存在是模棱两可SQLAlchemy 2.1 将要求在数据类层次结构具有 SQLAlchemy 映射属性混合类本身必须是数据类。...由于否则存在歧义,因此 SQLAlchemy 2.1 将要求在 dataclass 层次结构具有 SQLAlchemy 映射属性混合类本身必须是 dataclasses。...SQLAlchemy 2.0 系列数据类功能未正确遵守此行为;相反,非数据类混合类和超类上属性被视为最终数据类配置一部分。...由于否则它们存在是模棱两可,因此 SQLAlchemy 2.1 将要求在数据类层次结构具有 SQLAlchemy 映射属性混合类本身必须是数据类。

    41310

    SqlAlchemy 2.0 中文文档(八十)

    对于支持多个后端 DBAPI( pyodbc、zxJDBC、mxODBC),方言模块将使用来自 sqlalchemy.connectors 包混合物,这些混合物提供了跨所有后端该 DBAPI 功能...ResultProxy keys 属性现在是一个方法,因此引用(result.keys)必须更改为方法调用(result.keys())。...在 PostgreSQL 上,观察到这可以在某些查询中提供 300-600%加速。为任何在 NOT NULLable 外键上关系设置此标志,类似地,为任何保证存在相关项集合设置此标志。...ResultProxykeys属性现在是一个方法,因此引用(result.keys)必须更改为方法调用(result.keys())。...将mapper()和Table使用分开现在被称为“经典 SQLAlchemy 使用方式”,当然可以与声明性混合使用。 已从类删除了.c.属性(即MyClass.c.somecolumn)。

    18610

    SqlAlchemy 2.0 中文文档(七十八)

    (inspector, table, column_info): ... #2418 禁用 MySQL 自动检测排序规则和大小写敏感性 MySQL 方言进行两次调用,其中一次非常昂贵,从数据库加载所有可能排序规则以及大小写信息...#1401 #610 ### 新类/对象检查系统 许多 SQLAlchemy 用户正在编写需要检查映射类属性系统,包括能够访问主键列、对象关系、普通属性等,通常是为了构建数据编组系统, JSON...#1401 #610 新类/对象检查系统 许多 SQLAlchemy 用户正在编写需要检查映射类属性系统,包括能够访问主键列、对象关系、普通属性等,通常用于构建数据编组系统, JSON/XML 转换方案和各种表单库...(inspector, table, column_info): ... #2418 禁用 MySQL 自动检测排序规则和大小写 MySQL 方言在Engine连接时第一次进行两次调用,其中一次非常昂贵...(inspector, table, column_info): ... #2418 禁用 MySQL 自动检测排序规则和大小写敏感性 MySQL 方言进行两次调用,其中一次非常昂贵,从数据库加载所有可能排序规则以及大小写敏感性信息

    15110

    SqlAlchemy 2.0 中文文档(十九)

    对于保证具有元素属性,例如引用相关对象引用,其中引用外键不为 NULL,可以通过使用内连接使查询更有效;这在映射级别通过 relationship.innerjoin 标志可用: class...这种加载样式发出一个 SELECT,该 SELECT 引用父对象主键值,或者在一关系情况下引用子对象主键值,以便在 IN 子句中加载相关联关系: >>> from sqlalchemy import...多态急加载 支持急加载基础上每个急加载选项进行多态选项指定。...对于保证具有元素属性,例如对一个相关对象引用,其中引用外键不为 NULL,通过使用内连接可以使查询更有效率;这可以通过映射级别的relationship.innerjoin标志来实现: class...这种加载样式发出一个 SELECT,该 SELECT 引用父对象主键值,或者在一关系情况下引用子对象主键值,位于 IN 子句中,以加载相关联关系: >>> from sqlalchemy import

    24410

    SqlAlchemy 2.0 中文文档(七)

    使用registry.mapped()装饰器进行映射。以下是一个示例,位于使用具有命令式表预先存在数据类进行映射。...使用具有命令式表预先存在数据类进行映射 下面是使用带命令式表声明式(即混合声明)@dataclass进行映射示例。一个完整Table对象被显式地构建并分配给__table__属性。...另请参阅 当将转换为数据类时,属性源自不是数据类超类。 - 关于原因背景 关系配置 Mapped注解与relationship()结合使用方式与基本关系模式描述相同。...”样式映射添加了“已声明属性”样式 mixin 属性支持,即用于“使用声明式混合具有预先存在数据类”样式映射中 relationship() 结构以及具有外键声明 Column 对象。...:添加了“声明属性”风格 mixin 属性支持,即 relationship() 构造以及带有外键声明 Column 对象,用于在“具有声明性表”样式映射中使用。

    46020

    SqlAlchemy 2.0 中文文档(十)

    Mapper 定义 Python 类与数据库表或其他关系结构之间关联,以便该类进行 ORM 操作可以继续进行。...sentinel 列,允许在其他情况下没有符合条件主键配置表中进行高效批量插入,并且具有确定性 RETURNING 排序。...sort_order – 表示当 ORM 创建Table时,此映射列应如何与其他列排序整数。对于具有相同值映射列,默认使用默认排序,首先放置在主类定义映射列,然后放置在超类映射列。...mapped_column(),它生成所谓 sentinel 列,允许对于不具有合格主键配置进行具有确定性 RETURNING 排序高效批量插入。...属性排序基于以下规则: 从子类到超类顺序迭代类及其超类(即通过cls.__mro__迭代) 对于每个类,按照它们在__dict__中出现顺序生成属性,但以下步骤除外。

    20410
    领券