SQLAlchemy:按关系中的关系字段排序

2023-12-30

在我正在开发的金字塔应用程序中,我有以下场景:

class Widget(Base):
    __tablename__ = 'widgets'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    sidebar = Column(mysql.TINYINT(2))

    def __init__(self, name, sidebar):
        self.name = name
        self.sidebar = sidebar

class Dashboard(Base):
    __tablename__ = 'dashboard'
    user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
    widget_id = Column(Integer, ForeignKey('widgets.id'), primary_key=True)
    delta = Column(mysql.TINYINT)

    widget = relationship('Widget')

    def __init__(self, user_id, widget_id, delta):
        self.user_id = user_id
        self.widget_id = widget_id
        self.delta = delta 

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    login = Column(Unicode(255), unique=True)
    password = Column(Unicode(60))
    fullname = Column(Unicode(100))

    dashboard = relationship('Dashboard', order_by='Dashboard.widget.sidebar, Dashboard.delta')

    def __init__(self, login, password, fullname):
        self.login = login
        self.password = crypt.encode(password)
        self.fullname = fullname

因此,我希望用户“仪表板”关系具有用户的仪表板记录,但按“侧边栏”(这是仪表板的关系属性)排序。目前我收到此错误:

sqlalchemy.exc.InvalidRequestError: Property 'widget' is not an instance of ColumnProperty (i.e. does not correspond directly to a Column).

在关系声明中可以进行这种排序吗?

Thanks!


有了这个,尝试考虑 SQLAlchemy 在尝试加载 User.dashboard 时应该发出什么。喜欢SELECT * FROM dashboard JOIN widget ... ORDER BY widget.sidebar?或者SELECT * FROM dashboard ORDER BY (SELECT sidebar FROM widget...?通过不同的表对结果进行排序对于工作来说太开放了relationship()自己决定。可以做到这一点的方法是通过提供一个列表达式Dashboard当 ORM 针对仪表板的表发出一个简单的 SELECT 时,以及当它在一个不那么简单的 SELECT 中引用它时,它可能会立即跨用户、仪表板表连接(例如,急切加载),可以提供此排序。

我们提供自定义 SQL 表达式,特别是那些涉及其他表的表达式,使用列属性() http://docs.sqlalchemy.org/en/rel_0_9/orm/mapper_config.html?highlight=column_property#using-column-property,或者用延迟() http://docs.sqlalchemy.org/en/rel_0_9/orm/mapper_config.html?highlight=column_property#deferred当我们不希望默认加载该表达式时(就像这里的情况一样)。例子:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()

class Widget(Base):
    __tablename__ = 'widgets'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    sidebar = Column(Integer)

class Dashboard(Base):
    __tablename__ = 'dashboard'
    user_id = Column(Integer, ForeignKey('users.id'), primary_key=True)
    widget_id = Column(Integer, ForeignKey('widgets.id'), primary_key=True)
    delta = Column(Integer)

    widget = relationship('Widget')

    widget_sidebar = deferred(select([Widget.sidebar]).where(Widget.id == widget_id))

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    login = Column(Unicode(255), unique=True)

    dashboard = relationship('Dashboard', order_by='Dashboard.widget_sidebar, Dashboard.delta')


e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)

s = Session(e)

w1, w2 = Widget(name='w1', sidebar=1), Widget(name='w2', sidebar=2)
s.add_all([
    User(login='u1', dashboard=[
        Dashboard(
            delta=1, widget=w1
        ),
        Dashboard(
            delta=2, widget=w2
        )
    ]),
])
s.commit()

print s.query(User).first().dashboard

“.dashboard”负载发出的最终 SQL 是:

SELECT dashboard.user_id AS dashboard_user_id, dashboard.widget_id AS dashboard_widget_id, dashboard.delta AS dashboard_delta 
FROM dashboard 
WHERE ? = dashboard.user_id ORDER BY (SELECT widgets.sidebar 
FROM widgets 
WHERE widgets.id = dashboard.widget_id), dashboard.delta

请记住,MySQL 做了一个terrible像上面这样的子查询的工作优化。如果您在这里需要高性能,您可能会考虑将“sidebar”的值复制到“dashboard”中,尽管这会使一致性更难以维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy:按关系中的关系字段排序 的相关文章

随机推荐

  • AngularJS 根据用户输入切换样式表

    如何根据用户单击的按钮来切换 切换 AngularJS 页面的样式表 您实际上可以在 html 级别放置一个控制器并修改link标签的href Demo http plnkr co edit jBtP6FfmeRzOYUCnHg3t p p
  • 如何检测通知/系统栏何时打开

    我需要知道系统 通知栏何时在我的应用程序中打开 但我找不到任何真正的解决方案 所以我将一些东西组合在一起 看起来效果很好 在详细介绍实现之前 我将简要解释一下我的 非常老套的 逻辑 当某个 Activity 由于任何原因不再对用户可见时 将
  • xtensor 类型与 NumPy 简单归约的性能对比

    我正在尝试xtensor python https github com QuantStack xtensor python并开始编写一个非常简单的求和函数 之后使用千篇一律的设置 https github com QuantStack x
  • TypeORM - 如何在生产模式下创建新表并自动运行迁移?

    我想在 MySQL 中创建新表 并在应用程序在生产模式下运行时自动运行 TypeORM 迁移 注意 此新表不是在生产模式下启动应用程序之前创建的 根据迁移文档 https github com typeorm typeorm blob ma
  • 在Jupyter中逐步执行算法

    我试图一步步展示 Jupyter 中 Python 程序的执行情况 例如 我可以将程序中变量的值可视化 如以下玩具程序所示 from IPython display import display clear output from time
  • 如何在 pygtk 中使用线程

    我在 pygtk 中遇到线程问题 我的应用程序包含一个从互联网下载图片然后用 pygtk 显示它的程序 问题是 为了做到这一点并保持 GUI 响应能力 我需要使用线程 因此 在用户单击 下载图片 按钮后 我进入回调 并调用该方法来下载同一类
  • 将 CV_32FC1 类型的矩阵转换为 CV_64FC1

    如何将 CV 32FC1 类型的 cv Mat 转换为 CV 64FC1 类型 相当于从 float 变为 double 我正在打开一个保存为 XML 的矩阵 cvSave 但作为浮动 这意味着该领域 dt 有价值f在文件中 我需要将其更改
  • 在函数内修改Python中的全局字典

    usr bin env python def modify dict d two 2 d one 1 modify dict print d I get globaltest py two 2 one 1 我本来希望只看到 one 1 因为
  • Matlab:xcorr一维互相关归一化问题

    我有一个长度 5 的参考信号 s1 和另一个长度 25 个样本的信号 s2 包含相同 5 个样本信号 s1 的移位版本 我想找到两个信号之间的归一化互相关性 以计算信号 s1 和 s2 之间的样本距离 延迟 滞后 我用零填充 s1 因此它与
  • 什么时候是使用反引号的正确时间(和错误时间)?

    许多初学者都会写这样的代码 sub copy file my from shift my to shift cp from to 这很糟糕吗 为什么 应该使用反引号吗 如果是这样 怎么办 有些人已经提到 您应该只在以下情况下使用反引号 您需
  • 如何从 YYYY-MM-dd'T'HH:mm:ss.sssZ 获取时间

    嗨 我想抽出时间11 40 from 2017 07 31T11 40 00 000Z 下面是我正在使用的代码 let formatter Foundation DateFormatter formatter dateFormat YYYY
  • 在 C# 中的方法参数中使用“class”关键字

    我不确定我在哪里看到这个 而且我当然没有让编译器通过语法 是否可以使用 class C 关键字作为方法参数签名的一部分 foo 字符串 x 类 y 还有其他人看到这样的事情吗 谢谢 基因 你应该使用对象吗 看起来您正在尝试指定一个可以具有任
  • 将单个应用程序显示导出到 VNC

    我正在寻找一个脚本 解决方案来将单个 Linux 应用程序显示导出到 VNC 例如 客户端浏览网页 它需要身份验证 基本用户名密码 通过身份验证后 他会看到一个带有不同按钮的页面 每个按钮都与一个应用程序相关 例如 单击 firefox 按
  • 在views.py中使用Django模型表单时出现错误

    在我的 models py 中 class Alert models Model user models CharField max length 30 blank True a models IntegerField blank True
  • Chartjs - pointColor 跟随渐变描边的当前颜色

    我刚刚使用创建折线图chartjs http www chartjs org 图书馆和我设法用渐变颜色进行描边 这里很简单fiddle http jsfiddle net jvmk5o6a 例如我到目前为止所做的事情 接下来我需要做的是po
  • PowerShell 5.1 为什么不同 2016 sp1/sp3 数据库上的相同查询返回不同类型

    电源外壳 5 1SQL Server 2016 SP1 和 SP3 如果我运行相同的select top 1在 2 个 SQL Server 2016 数据库 一个在 sp3 上 另一个在 sp1 上 之间查询 它们返回不同的类型 为什么
  • 将Angular6中的main.js拆分为多个文件

    当我构建 main js 时 我正在使用 Angular 6 当我们构建这个应用程序时 我预计它会变得更大 大小约为 8 MB 有没有办法将此文件拆分为多个文件 以便加载速度更快 有没有办法在需要的时候实现延迟加载 chunk 0 runt
  • 如何将数据文件的第一行视为 gnuplot 中的列标签?

    我有一个这样的表 A B C D E F G H I 10 23998 16755 27656 17659 19708 20328 19377 18925 20 37298 33368 53936 41421 44548 40756 409
  • 抽屉开关未按预期工作(图标保持不变)

    我正在尝试在我的应用程序中实现 ActionBarDrawerToggle 但无法实现 我已经实现在工具栏中显示切换按钮 但图标始终相同 这是抽屉关闭时切换的图标 https i stack imgur com HTcom png http
  • SQLAlchemy:按关系中的关系字段排序

    在我正在开发的金字塔应用程序中 我有以下场景 class Widget Base tablename widgets id Column Integer primary key True name Column String 50 side