Ich verwende Python mit adodbapi von pywin32, um ein Skript zum Erstellen einer SQL Server-Datenbank mit allen zugehörigen Tabellen, Sichten und Prozeduren zu schreiben. Das Problem besteht darin, dass Pythons DBAPI erfordert, dass cursor.execute() in eine Transaktion eingeschlossen wird, die nur von cursor.commit() übergeben wird, und Sie können keine drop- oder create database-Anweisung in einer Benutzertransaktion ausführen. Irgendwelche Ideen, wie man das schafft?Erstellen einer SQL Server-Datenbank aus Python
EDIT:
Es scheint nicht der connect() -Methode von adodbapi oder dessen Cursor() -Methode, um etwas analog zu einem autocommit Parameter zu sein. Ich würde glücklich sein, Pymssql anstelle von Adodbapi zu verwenden, außer dass es char und varchar Datentypen bei 255 Zeichen abschneidet.
Ich habe dies vor dem Posten versucht; Hier ist die Rückverfolgung.
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
Das ist nah dran. Was zuletzt funktioniert hat, war: conn.adoConn.Execute ("create database dummydatabase") Danke! Ich hätte das vielleicht nie herausgefunden. – JasonFruit