2016-11-04 60 views
2

似乎并不像SqlAlchemy支持调用存储过程。有没有人找到解决这个适用于SQL Server的解决方法?从SqlAlchemy调用MSSQL存储过程

示例过程:

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:[email protected]/db?driver=SQL Server', echo=True) 
engine.execute("list_lock_set ?, ?", ['bbc', 'sqlalchemy']) 

谢谢。

编辑:看来最好的解决方案是从发动机捞出pyodbc光标:

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

我也能获得pyodbc连接:

engine.raw_connection().connection 

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

+0

dbc.execute(“EXEC list_lock_set?,?”,['bbc','pyodbc'])是否工作? –

+0

@罗斯布什只是试了一遍无效 – Muposat

回答

1

我记得这也给我悲伤之前。从内存session.execute()connection.execute()为我工作。还有一个callproc()方法,这可能是正确的选择。 http://docs.sqlalchemy.org/en/latest/core/connections.html

另外,我以前遇到过MSSQL的问题,这似乎是由于在程序完成之前返回方法所导致的异步事件,导致数据库中出现不可预知的结果。我发现在调用之后立即加上time.sleep(1)(或任何合适的数字)。

+0

谢谢,engine.raw_connection()。cursor()获取底层pyodbc游标,我可以直接做这些事情。 – Muposat

+0

嗨@Batman,你有没有想过你正在经历的异步行为是怎么回事?我收到了类似的东西,无法找到根本原因。 –

+0

不尽如人意。这个程序肯定是没有完成的问题,但其他的一些人说,放入'time.sleep'我从来没有找到解决方案。 – Batman