Python 在单个SQLAlchemy查询上选择函数和表列
我做了一些搜索,但没有找到任何例子 在使用SQLAlchemy Core时,是否有方法从表和函数调用中查询多个列 这就是我想要实现的查询:Python 在单个SQLAlchemy查询上选择函数和表列,python,sqlalchemy,Python,Sqlalchemy,我做了一些搜索,但没有找到任何例子 在使用SQLAlchemy Core时,是否有方法从表和函数调用中查询多个列 这就是我想要实现的查询: 选择 t、 id,t.field_1,t.field_2, 一些_函数(t.field_2,t.field_3)* 从我的桌子上 其中,some_function是一个返回三元组的函数,例如calc_field_1,calc_field_2和calc_field_3 结果集应该是这样一个表: 身份证件 字段_1 字段2 计算字段1 计算字段2 计算字段3
选择
t、 id,t.field_1,t.field_2,
一些_函数(t.field_2,t.field_3)*
从我的桌子上
其中,some_function
是一个返回三元组的函数,例如calc_field_1
,calc_field_2
和calc_field_3
结果集应该是这样一个表:
身份证件
字段_1
字段2
计算字段1
计算字段2
计算字段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核心上表达
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核对谢谢回复。我看到过这样的例子,但这会有同样的效果吗?是否会为查询中的每一行调用
某些函数
?尝试了该建议,PostgreSQL抱怨:错误:FROM中的函数不允许使用聚合函数
。我会尽快尝试MySQL,但我怀疑这也不可能。再次感谢@inf581。对于这种noob问题我很抱歉,但这不会迫使函数被调用三次吗?这取决于函数和数据库,如果函数是确定性的,那么它的执行计划可能会被缓存。您可以始终在数据库上检查结果查询的执行计划以确保。