Python 在单个SQLAlchemy查询上选择函数和表列

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

我做了一些搜索,但没有找到任何例子

在使用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 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问题我很抱歉,但这不会迫使函数被调用三次吗?这取决于函数和数据库,如果函数是确定性的,那么它的执行计划可能会被缓存。您可以始终在数据库上检查结果查询的执行计划以确保。