加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 从SqlAlchemy调用MSSQL存储过程

发布时间:2020-12-16 22:46:12 所属栏目:Python 来源:网络整理
导读:看起来SqlAlchemy似乎不支持调用存储过程.有没有人找到适用于SQL Server的解决方法? 样品程序: CREATE PROCEDURE list_lock_set @name varchar (5),@requester varchar(30)ASBEGIN SET NOCOUNT ON; INSERT INTO list_lock (name,requester,acquired) value

看起来SqlAlchemy似乎不支持调用存储过程.有没有人找到适用于SQL Server的解决方法?

样品程序:

CREATE PROCEDURE list_lock_set @name varchar (5),@requester varchar(30)
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO list_lock (name,requester,acquired) values (@name,@requester,GETDATE())
    RETURN 0    
END
GO

这有效:

import pyodbc
dbh = pyodbc.connect(driver=''{SQL Server}'',server=srv,database=db,uid=uid,pwd=pwd)
dbc = dbh.cursor()
dbc.execute("list_lock_set ?,?",['bbc','pyodbc'])
dbc.commit()

这不会产生错误,但也不起作用:

from sqlalchemy import create_engine
engine = create_engine('mssql+pyodbc://usr:passw@srv/db?driver=SQL Server',echo=True)
engine.execute("list_lock_set ?,'sqlalchemy'])

谢谢.

编辑:似乎最好的解决方案是从引擎中删除pyodbc游标:

cursor = engine.raw_connection().cursor()
cursor.execute("list_lock_set ?,'using cursor'])
cursor.commit()

我也可以获得pyodbc连接:

engine.raw_connection().connection

并设置autocommit = True,但这可能会干扰引擎逻辑.非常感谢@Batman.

最佳答案
我记得这也让我感到悲伤.从内存中session_namecute()或connection.execute()为我工作.还有一个callproc()方法,这可能是正确的方法. http://docs.sqlalchemy.org/en/latest/core/connections.html

此外,我在MSSQL过去遇到了一些问题,这似乎是由于在程序完成之前方法返回的异步事件,导致数据库出现不可预测的结果.我发现在调用之后立即设置time.sleep(1)(或任何适当的数字).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读