You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask-SQLAlchemy中调用返回表的T-SQL函数?

解决Flask-SQLAlchemy调用SQL Server表值函数的问题

你的问题核心在于:SQLAlchemy会把func.dbo.myTableFunction()解析为标量函数,生成的SQL会将函数调用作为列查询;但你需要的是把表值函数作为数据源放在FROM子句中调用,所以原有写法才会报错。

下面是几种可行的解决方案:

方法1:直接使用原生SQL文本(最简单)

用text构造符合需求的SQL语句,通过参数绑定传递参数,避免SQL注入风险:

from sqlalchemy import text

# 替换param1_val、param2_val为实际业务参数
result = db.session.execute(
    text("SELECT * FROM dbo.myTableFunction(:param1, :param2)"),
    {"param1": param1_val, "param2": param2_val}
).fetchall()

返回结果是元组列表,如果需要字典格式,可转换为:

result_dicts = [dict(row) for row in result]

方法2:使用SQLAlchemy原生select语法

通过select().select_from()将表值函数作为查询数据源,让SQLAlchemy生成正确的SQL结构:

from sqlalchemy import select

stmt = select("*").select_from(func.dbo.myTableFunction(param1_val, param2_val))
result = db.session.execute(stmt).fetchall()

如果需要指定返回列(而非全量*),可以直接指定列名:

stmt = select(
    func.dbo.myTableFunction(param1_val, param2_val).c.id,
    func.dbo.myTableFunction(param1_val, param2_val).c.name
)
result = db.session.execute(stmt).fetchall()

方法3:映射到ORM模型(结构化返回)

如果希望将函数返回结果映射为Flask-SQLAlchemy模型实例,先定义与函数返回结构匹配的抽象模型:

class MyFuncResult(db.Model):
    __abstract__ = True  # 标记为抽象模型,无需对应数据库实际表
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    create_time = db.Column(db.DateTime)
    # 其他字段与函数返回列一一对应

再通过from_statement执行查询:

from sqlalchemy import text

stmt = text("SELECT * FROM dbo.myTableFunction(:param1, :param2)")
result = db.session.query(MyFuncResult).from_statement(stmt).params(
    param1=param1_val, param2=param2_val
).all()

返回结果是模型实例列表,可直接通过属性访问字段(如row.name)。


内容的提问来源于stack exchange,提问作者LattePrincess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:33:11