質問

私は、SQL Serverデータベースとそのすべての関連するテーブル、ビュー、およびプロシージャを作成するためのスクリプトを書くことpywin32のadodbapiでのPythonを使用しています。問題は、PythonのDBAPIはcursor.executeは()のみ)cursor.commit(によってコミットされたトランザクションにラップされ、ドロップを実行したり、ユーザーのトランザクションでデータベース文を作成することができないことを必要とすることです。その周りを取得する方法上の任意のアイデア?

EDITます:

接続adodbapiの()メソッドまたはそのカーソル()メソッドのいずれかに自動コミット・パラメータに類似したものがあるように思えません。私はそれが255文字でのcharとvarcharデータ型を切り捨てることを除いて、代わりにadodbapiのpymssqlを使用させていただきます。

私は投稿する前にこれを試していました。ここでトレースバックです。

Traceback (most recent call last):
  File "demo.py", line 39, in <module>
    cur.execute("create database dummydatabase")
  File "C:\Python26\lib\site-packages\adodbapi\adodbapi.py", line 713, in execute
    self._executeHelper(operation,False,parameters)
  File "C:\Python26\lib\site-packages\adodbapi\adodbapi.py", line 664, in _executeHelper
    self._raiseCursorError(DatabaseError,tracebackhistory)
  File "C:\Python26\lib\site-packages\adodbapi\adodbapi.py", line 474, in _raiseCursorError
    eh(self.conn,self,errorclass,errorvalue)
  File "C:\Python26\lib\site-packages\adodbapi\adodbapi.py", line 60, in standardErrorHandler
    raise errorclass(errorvalue)
adodbapi.adodbapi.DatabaseError: 
--ADODBAPI
Traceback (most recent call last):
   File "C:\Python26\lib\site-packages\adodbapi\adodbapi.py", line 650, in _executeHelper
    adoRetVal=self.cmd.Execute()
   File "<COMObject ADODB.Command>", line 3, in Execute
   File "C:\Python26\lib\site-packages\win32com\client\dynamic.py", line 258, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
 com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft SQL Native Client', u'CREATE DATABASE statement not allowed within multi-statement transaction.', None, 0, -2147217900), None)
-- on command: "create database dummydatabase"
-- with parameters: None
役に立ちましたか?

解決

データベースがトランザクションをサポートしている場合、すべてのコミット後に

adodbapi接続オブジェクトのconnは、自動的に新しいトランザクションを開始しません。 DB-APIはデフォルトではオフになって、それがAPIメソッドが戻ってそれをオンすることができますが、私はadodbapiの1が表示されていないことを、自動コミットが必要です。

あなたは、任意のトランザクションのあなたを取る代わりに、DB-APIのADO APIを使用して、この周りをハックするconn.adoConnプロパティを使用することができるかもしれません。これが動作するかどうか、私に教えてくださいます:

conn.adoConn.CommitTrans()
cursor.execute('CREATE DATABASE ...')
conn.adoConn.BeginTrans()

ここ<のhref = "http://pywin32.cvs.sourceforge.net/viewvc/pywin32/pywin32/adodbapi/adodbapi.py?revision=1.9&view=markup#l_411" のrel = "nofollowのためのソースですnoreferrer "> adodbapi commit()メソッドでます。

他のヒント

「の問題は、PythonのDBAPIはcursor.executeは()のみcursor.commitによってコミットされたトランザクションに包まれることを必要とすることである()」

「とドロップを実行したり、ユーザーのトランザクションでデータベース文を作成することはできません。」

私はこのすべては、実際にすべてのDBAPIインターフェイスに対して真であるかわからない。

あなたは、エラーメッセージは表示されませんので、

、これはADODBAPIインターフェイスに対して真ではないことが判明することがあります。あなたが実際にそれを試してみましたか?もしそうなら、あなたはどのようなエラーメッセージが出ていますか?

接続は、の常にのは、 "ユーザートランザクション" を作成することはできません。あなたは、多くの場合、autocommit=Trueとのオープン接続がDDLスタイルの自動コミットを取得することができます。

また、あなたは実行DDLを行うには別の接続を使用して検討する必要があります。

http://pymssql.sourceforge.net/ を、例えば、DDLは次のように実行されて示しています。

import pymssql
conn = pymssql.connect(host='SQL01', user='user', password='password', database='mydatabase')
cur = conn.cursor()
cur.execute('CREATE TABLE persons(id INT, name VARCHAR(100))')

トランザクション外で、実際のDBを作成します。私は、Pythonに慣れていないんだけど、実際の作成デシベルコマンドであることを使用し、データベース上でユーザー指定の文字列を実行するための方法がなければなりません。その後、すべてのテーブルなどを行うと、そのトランザクションをコミットするadodbapiを使用します。

(例えばDBCC CHECKDB ...)adodbapi上で実行するコマンドをしようとしているときに、私はこの同じ問題を持っていたjoeforkerのアドバイスはビットを助けました。私はまだ持っていた問題はadodbapiが自動的にトランザクションを開始することだったので、トランザクションの外で何かを実行する方法はありませんでした。

私はadodbapi年代を無効にしてしまった最後には、次のように行動をコミットします:

self.conn = adodbapi.connect(conn_str)
# rollback the transaction that was started in Connection.__init__()
self.conn.adoConn.RollbackTrans() 
# prevent adodbapi from trying to rollback a transaction in Connection.close()
self.conn.supportsTransactions = False

私の知る限り、この標準のSQL Serverの自動コミット機能を、すなわち、各SQLステートメントが自動的にコミットされて再び有効にします。欠点は、私がときConnection.commit() supportsTransactions == Falseは何もしないだろうから、トランザクション内で何かを実行するためにwan't場合は(現時点では)再び有効取引に私のための方法がないということです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top