2016-11-04 12 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

@Ross Bushはもう役に立たないようにしました – 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

関連する問題