在 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 SQLpyodbc
没有实现.callproc
,所以你需要使用.execute
。也就是说,答案对于 oracle 是正确的(+1),并且也适用于 Postgres(即我使用它的方式)。以上是关于在 sqlalchemy 中执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章
使用 SqlAlchemy 执行返回 REF CURSOR 的 Oracle 存储过程
sqlalchemy 调用 mssql存储过程如何获取返回值?