2017-02-02 2 views
3

Я пытаюсь создать базу данных SQL Server с помощью pyodbc.«CREATE ... заявление не допускается в транзакции с несколькими операторами» при использовании pyodbc

import pyodbc 
server = 'AMR112\NAMED1' 
database = 'msdb' 
username = '' 
password = 'mypassword' 
abcd='yes' 
ghi='False' 
#driver = '{/usr/local/lib/libtdsodbc.so}' #for linux of windows 
driver= '{ODBC Driver 13 for SQL Server}' 
cnxn = pyodbc.connect('DRIVER='+driver+';PORT=1433;SERVER='+server+??';PORT=1443;DATABASE??='+database+';UID='+??username+';PWD='+ password+';trusted_connection='+ abcd+'; autocommit='+ ghi) cursor = cnxn.cursor() 
cursor.execute("create database dbafgh") 
row = cursor.fetchone() 
if row: 
    print row 
cursor.close() 

Это терпит неудачу с этой ошибкой

CREATE заявление DATABASE не допускается в транзакции с несколькими операторами

Это терпит неудачу, потому что метод .execute начинает транзакцию и CREATE DATABASE не может быть запущена в пределах сделка.

Итак, есть ли другой способ выполнить команду CREATE DATABASE с использованием python?

+0

Попробуйте [установка 'AutoCommit = True '] (http://stackoverflow.com/a/1064149/61305). –

+0

Я просто попробовал. Это не работает. – userbb

+0

тоже испробовал. Он не работает – userbb

ответ

3

При установлении соединения pyodbc по умолчанию имеет значение autocommit=False в соответствии с спецификацией DB-API Python. Поэтому, когда выполняется первый оператор SQL, ODBC начинает транзакцию базы данных, которая остается в силе до тех пор, пока код Python не сделает .commit() или .rollback() в соединении.

SQL Server не разрешает выполнять CREATE DATABASE в рамках такой транзакции, поэтому перед выпуском таких заявлений нам необходимо установить соединение в autocommit. Это может быть достигнуто при открытии соединения ...

conn = pyodbc.connect(conn_str, autocommit=True) 

... или путем переключения в режим autocommit, если соединение уже установлено:

conn = pyodbc.connect(conn_str) # autocommit=False by default 
# ... 
conn.autocommit = True 
conn.execute("CREATE DATABASE MyNewDatabase") 
+0

спасибо большое .. он работает ... – userbb