python - Sqlalchemy 最多 2 列
问题描述
我需要能够在sqlalchemy
. 这 2 列可能来自 2 个不同的表。该操作的纯 SQL 模拟将是:
Select Id,
Case When Col1 < Col2 Then Col1
Else Col2
End As TheMin
From TableName
我一直在浏览文档,并没有找到一种直接的方法来做到这一点。这如何实现sqlalchemy
?
解决方案
如果您使用的 RDBMS 支持函数GREATEST
和LEAST
,您应该考虑使用它们,因为它们支持超过 2 列并正确处理NULL
值。这些包括postgresql、mysql、 DB、 MariaDB 和 Oracle。
但是,如果您确实需要自定义 2 值比较,我建议您遵循官方文档中的“GREATEST”函数示例,这将允许您以通用方式使用该函数 - 如果引擎支持它,请使用 DB 级函数,以及自定义实现(sqlite、MS SQL 等)。
但是,您应该小心一个值为 NULL 的情况,这可能不会产生所需的结果。
无论如何,您关心的查询可以写成如下:
least_clause = (
sa.case(
[(ModelA.val < ModelB.val, ModelA.val)],
else_=ModelB.val,
)
)
# query
q = (
session
.query(
least_clause.label("TheMin"),
least(ModelA.val, ModelB.val).label("custom-least"), # this is if you use custom function from linked example
sa.func.least(ModelA.val, ModelB.val).label("builtin-least"), # only support for build-int LEAST function
ModelA,
ModelB,
)
.select_from(ModelA)
.outerjoin(ModelB, ModelA.key == ModelB.key)
)
推荐阅读
- javascript - 为什么我的 html(Javascript) 代码在 vsCode 中不起作用?
- c# - Blazor:EditForm.Model 更改后如何保持对输入的关注
- quartz.net - Quartz .NET 和 Resiliense,如何正确处理这种情况
- angular - 我们可以在用户单击 Angular11 中的浏览器选项卡关闭确认单击取消/继续后执行操作吗?
- python - 我正在尝试使用 Python 在列表中查找字符串的最大出现次数
- flutter - 冻结了如何在顶级模型上分配我自己的 JsonConverter?
- twitter-bootstrap - 如何使列内的文本居中?
- uml - 创建类图的最佳方法
- python - 无法在新的 anaconda 安装上更新 spyder=5.1.5
- terraform - 为 fusionauth 导入 terraform 资源时出错