[英]SQLAlchemy Executing Stored Procedure with Output
我正在尝试使用 python 的 sqlalchemy 模块执行存储过程并访问其 output 。
我找到了这篇文章,但无法让它在没有错误的情况下运行。
SQL 存储过程
USE [TestDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[testPython]
@numOne int,
@numTwo int,
@numSum int OUTPUT
AS
BEGIN
LINENO 0
SET NOCOUNT ON;
SET @numSum = @numOne + @numTwo
END
GO
Python
import sqlalchemy as db
engine = db.create_engine(f"mssql+pyodbc://{username}:{password}@{dnsname}/{dbname}?driver={driver}")
with engine.connect() as conn:
outParam = db.sql.outparam("ret_%d" % 0, type_=int)
result = conn.execute('testPython ?, ?, ? OUTPUT', [1, 2, outParam])
print(result)
它返回的错误
TypeError:“BindParameter”类型的 object 没有 len()
上述异常是以下异常的直接原因:
SystemError: <class 'pyodbc.Error'> 返回带有错误集的结果
编辑:感谢mkleehammer 的 github ,我已经设法让它与 pyodbc 一起工作。 如果有人知道,我仍然想知道如何使用 sqlalchemy 来做到这一点。
pyodbc 代码
def testsp():
query = """
DECLARE @out int;
EXEC [dbo].[testPython] @numOne = ?, @numTwo = ?, @numSum = @out OUTPUT;
SELECT @out AS the_output;
"""
params = (1,2,)
connection = pyodbc.connect(f'DRIVER={DRIVER_SQL};SERVER={DNSNAME_SQL};DATABASE={DBNAME_SQL};UID={USERNAME_SQL};PWD={PASSWORD_SQL}')
cursor = connection.cursor()
cursor.execute(query, params)
rows = cursor.fetchall()
while rows:
print(rows)
if cursor.nextset():
rows = cursor.fetchall()
else:
rows = None
cursor.close()
connection.close()
只需使用简单的 pyodbc 解决方案中相同的匿名代码块的稍微修改版本:
import sqlalchemy as db
engine = db.create_engine("mssql+pyodbc://scott:tiger^5HHH@mssql_199")
query = """\
SET NOCOUNT ON;
DECLARE @out int;
EXEC [dbo].[testPython] @numOne = :p1, @numTwo = :p2, @numSum = @out OUTPUT;
SELECT @out AS the_output;
"""
params = dict(p1=1, p2=2)
with engine.begin() as conn:
result = conn.execute(db.text(query), params).scalar()
print(result) # 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.