在 sqlalchemy 中执行存储过程

Posted

技术标签:

【中文标题】在 sqlalchemy 中执行存储过程【英文标题】:Executing stored procedures in sqlalchemy 【发布时间】:2015-06-11 08:06:01 【问题描述】:

我在 sqlalchemy 中使用 raw_connection 来执行一些运行存储过程的 SQL。

存储过程在最后选择一个参数 ID。 我怎样才能找到这个 ID?

python代码是:

import sqlalchemy as sa

SQLCommand = """
    DECLARE @Msg varbinary(max) = CAST(%s AS varbinary(max) )
    EXECUTE dbo.usp_procedure @Type = 32, @header = %s, @store = @Msg
    """ % (Datacontent, var)


Engine = sa.create_engine(connection_string)
Connection = Engine.raw_connection()
cursor = Connection.cursor()
cursor.execute(SQLCommand)
return_key = list(cursor.fetchall())
Connection.commit()
Connection.close()

我认为 return_key 将包含来自 usp_procedure 的返回码,但它出错了,我得到:

No results.  Previous SQL was not a query.

该过程作为最后一步:

SELECT @ParamID

我希望能够在我的 python 代码中读回这段代码

【问题讨论】:

我不使用sql-server,所以我无法检查真正的语法,但我建议您在存储过程中使用输出参数,类似于this SO question。如果您只是在存储过程中执行print,则取回该值将更加困难。希望对您有所帮助。 好的,让开发人员修改程序以获得输出参数,但仍然存在问题。 【参考方案1】:

我没有 sql-server 并且仅针对 oracle 进行了测试,但是这对于评论来说太长了。

创建了这个简单的存储过程,

CREATE OR REPLACE PROCEDURE PROCEDURE1(inp IN VARCHAR2, outp OUT VARCHAR2) AS 
BEGIN
  IF (inp = 'true') THEN
    outp := '1';
    RETURN;
  END IF;
  IF (inp = 'false') THEN
    outp := '0';
    RETURN;
  END IF;
  outp := NULL;
  RETURN;
END PROCEDURE1;

并使用以下代码对其进行了测试:

Connection = c.manager.engine.raw_connection()
cursor = Connection.cursor()
result = cursor.callproc("PROCEDURE1", ['true', ''])
print(result[1])
result = cursor.callproc("PROCEDURE1", ['false', ''])
print(result[1])

结果如预期的那样是 1 和 0。

我一直在浏览,我希望callproc 可用于sql-server,例如here 但老实说,我不是 sqlalchemy 将使用的对象。试试看,希望对你有帮助。

【讨论】:

MS SQL pyodbc 没有实现.callproc,所以你需要使用.execute。也就是说,答案对于 oracle 是正确的(+1),并且也适用于 Postgres(即我使用它的方式)。

以上是关于在 sqlalchemy 中执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用 SqlAlchemy 执行返回 REF CURSOR 的 Oracle 存储过程

sqlalchemy 调用 mssql存储过程如何获取返回值?

使用sqlalchemy序列化为字典存储过程结果

flask_sqlalchemy 调用存储过程

我可以在没有事务的情况下通过 sqlalchemy 执行查询吗

plsql中如何执行存储过程?