python - 在单个 SQLAlchemy 查询中选择函数和表列
问题描述
我做了一些搜索,但找不到任何示例。
有没有办法在使用 SQLAlchemy Core 时从表和函数调用中查询多个列?
这是我想要实现的查询:
SELECT
t.id, t.field_1, t.field_2,
some_function(t.field_2, t.field_3).*
FROM my_table t
哪里是一个返回三元组的some_function
函数,比如说calc_field_1
和calc_field_2
calc_field_3
结果集应该是这样的表:
ID | 字段_1 | 字段_2 | calc_field_1 | calc_field_2 | calc_field_3 |
---|---|---|---|---|---|
1 | ... | ... | ... | ... | ... |
2 | ... | ... | ... | ... | ... |
3 | ... | ... | ... | ... | ... |
解决方案
如果可以将原始 SQL 更改为此
SELECT
t.id, t.field_1, t.field_2,
calc_field_1, calc_field_2, calc_field_3
FROM my_table t, some_function(t.field_2, t.field_3);
然后可以在 Sqlalchemy Core 上表达
stmt = (
select([
my_table.c.id,
my_table.c.field_1,
my_table.c.field_2,
column('calc_field_1'),
column('calc_field_2'),
column('calc_field_3')
])
.select_from(my_table)
.select_from(func.some_function(my_table.c.field_2, my_table.c.field_3))
)
目前(从 Sqlalchemy 1.3 开始)文档建议在这里. Sqlalchemy 1.4(测试版)应该提供表值函数
如果您不能将函数移动到 -FROM
子句,那么..
from sqlalchemy import literal_column
from sqlalchemy.sql.expression import Grouping
stmt = (
select([
my_table.c.id,
my_table.c.field_1,
my_table.c.field_2,
Grouping(
func.some_function(my_table.c.field_2, my_table.c.field_3)
).op('.')(literal_column('calc_field_1')).label('calc_field_1'),
Grouping(
func.some_function(my_table.c.field_2, my_table.c.field_3)
).op('.')(literal_column('calc_field_2')).label('calc_field_2'),
Grouping(
func.some_function(my_table.c.field_2, my_table.c.field_3)
).op('.')(literal_column('calc_field_3')).label('calc_field_3'),
])
.select_from(my_table)
)
它将产生以下 SQL
SELECT t.id, t.field_1, t.field_2,
(some_function(t.field_2, t.field_3)) . calc_field_1 AS calc_field_1,
(some_function(t.field_2, t.field_3)) . calc_field_2 AS calc_field_2,
(some_function(t.field_2, t.field_3)) . calc_field_3 AS calc_field_3
FROM my_table t
和一个速记操作:
from sqlalchemy.sql import functions
class some_function(functions.GenericFunction):
def __getitem__(self, key):
return Grouping(self).op('.')(column(key, String))
stmt = (
select([
my_table.c.id,
my_table.c.field_1,
my_table.c.field_2,
some_function(my_table.c.field_1, my_table.c.field_2)['calc_field_1'].label('calc_field_1'),
some_function(my_table.c.field_1, my_table.c.field_2)['calc_field_2'].label('calc_field_2'),
some_function(my_table.c.field_1, my_table.c.field_2)['calc_field_3'].label('calc_field_3'),
])
.select_from(my_table)
)
解决方案取自这里,用 postgresql 检查
推荐阅读
- memory - 如何将对象添加到多处理进程?
- python - 如何在类的方法中获取 python 自类属性?
- c# - 有没有办法使用 C# 和 SDKV4 创建的 MS Chat BOT 中的 PromptOptions 突出显示通过 Choice 显示的按钮选项?
- python - 构建爬虫将数据输入网站搜索引擎提取结果
- php - Laravel 按需通知与 CC
- python - 在 python 中生成关于 json 的差异报告
- python - 设置 seaborn 绘图的字体大小
- arrays - 如何修改我的代码以拆分提供的文本?
- android - 导航抽屉项目选定的侦听器不起作用(Kotlin)
- mongodb - Mongo 查询以查找任何字段元素与任何查询参数元素匹配的文档