按主键排序 sqlalchemy 关系

Posted

技术标签:

【中文标题】按主键排序 sqlalchemy 关系【英文标题】:sorting sqlalchemy relationships by primary key 【发布时间】:2015-08-14 16:14:21 【问题描述】:

如何使关系属性按子表主键排序?我有一个架构,其中许多表都有一个共同的父级,并且父级有一个使用 declaritive 系统的每个子级的列表

class Scenario(Base):
   __tablename__ = 'scenarios'
   id = Column(Integer, primary_key=True, autoincrement=True)

class ScenarioMixin(object):
   @declared_attr
   def scenario_id(cls):
      return Column(None, ForeignKey(Scenario.id),
                    primary_key=True,
                    index=True)

   @declared_attr
   def scenario(cls):
      return relationship('Scenario',
                          backref=backref(cls.__tablename__))

# example scenario-specific table
class Child(Base, ScenarioMixin):
   __tablename__ = 'children'
   id1 = Column(String, primary_key=True)
   id2 = Column(String, primary_key=True)

所以场景对象有一个属性children,它是一个孩子列表。这很好用,只是列表中子对象的顺序是任意的。这对于应用程序的语义来说很好,它会导致不确定的行为。配置 mixin 以使每个子列表都按其表的主键排序(即使它是复合主键)的最佳方法是什么?

【问题讨论】:

【参考方案1】:

在您的关系定义中指定 order_by 参数,如下面的代码所示。

@declared_attr
def scenario(cls):
    return relationship(
        'Scenario',
        backref=backref(
            cls.__tablename__,
            order_by=lambda: cls.__table__.primary_key.columns
        ),
    )

在您的情况下,您不能立即返回 cls.__table__.primary_key.columns,因为在定义时 __table__ 尚不存在。但返回一个可调用的作品。

更多信息请参见Relationships API。

【讨论】:

这为不需要订购的孩子订购(单个)父对象对象。我正在尝试订购父级的多个子对象。 你说得对,我没注意。无论如何,改变了答案。

以上是关于按主键排序 sqlalchemy 关系的主要内容,如果未能解决你的问题,请参考以下文章

ClickHouse ,选择 top n 并按主键排序的问题

Flask-SQLAlchemy 学习总结

flask_sqlalchemy

ClickHouse实战--ClickHouse的主键

如何将 Sqlalchemy ORM 查询结果转换为包含关系的单个联接表?

SQlAlchemy的增删改查