【问题标题】:sqlalchemy Stored Procedure with Output带输出的 sqlalchemy 存储过程
【发布时间】:2020-01-10 21:19:46
【问题描述】:

我想调用一个存储过程并在python中接收输出参数。我正在使用 sqlAlchemy 并且可以使用参数,但不知道如何将输出读入变量。我知道sqlAlchemy中有一个outParam()属性,但是我没有找到有用的例子。

这是一个简单的测试用SQL代码:

CREATE PROCEDURE [dbo].[Test]
    @numOne int,
    @numTwo int,
    @numOut int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SET @numOut = @numOne + @numTwo

END

还有简单的python:

engine = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
outParam = 0
result = engine.execute('Test ? ,?, ? OUTPUT', [1, 2, outParam])

outParam 仍为 0。我尝试使用以下命令对其进行修改:

outParam = sqlalchemy.sql.outparam("ret_%d", type_=int)

但这会产生“编程错误”。我错过了什么?

【问题讨论】:

    标签: python stored-procedures parameters sqlalchemy output-parameter


    【解决方案1】:

    SQLAlchemy 返回一个ResultProxy 对象。试试这样:

    engine = sqlalchemy.create_engine(...)
    rproxy = engine.execute(...)
    result = rproxy.fetchall()
    

    result 应该是 listRowProxy 对象,您可以将其视为字典,键入查询中的列名。

    如果您正在寻找真正的OUT 参数,那么您的方法几乎是正确的。对sqlalchemy.sql.outparam 的调用中的第一个参数只有一个小错误(但它是有效的 Python 语法)。应该是这样的:

    outParam = sqlalchemy.sql.outparam("ret_%d" % i, type_=int)
    

    注意第一个参数的变化:它只需要一个值来替换格式字符串。第一个参数是key 值,很可能%d 将被替换为列索引号(应该在i 中)。

    【讨论】:

    • 这是一个很好的解决方法,但我对 SQL 和 Python 之间的正确接口更感兴趣
    • @DanG 如果您特别希望使outparam 通话正常工作,我用一些信息更新了这个答案。你的方法几乎是正确的,只是一个小问题,只会在运行时被捕获,并且可能只有在查询被传递到数据库之后。
    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多