2017-02-02 2 views
3

J'essaie de créer une base de données SQL Server à l'aide de pyodbc."L'instruction CREATE ... n'est pas autorisée dans une transaction à plusieurs instructions" lors de l'utilisation de 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() 

Il échoue avec cette erreur

instruction CREATE DATABASE pas autorisée dans les transactions multi-instruction

Il échoue parce que la méthode .execute démarre une transaction et CREATE DATABASE ne peut pas être exécuté dans un transaction.

Y a-t-il un autre moyen d'exécuter une commande CREATE DATABASE en utilisant python?

+0

Essayez [paramètre 'autocommit = True '] (http://stackoverflow.com/a/1064149/61305). –

+0

Je viens d'essayer. Il ne fonctionne pas .. – userbb

+0

essayé aussi. Il échoue – userbb

Répondre

3

Lors de l'établissement d'une connexion, pyodbc utilise par défaut autocommit=False conformément aux spécifications DB-API de Python. Par conséquent lorsque la première instruction SQL est exécutée, ODBC commence une transaction de base de données qui reste en vigueur jusqu'à ce que le code Python effectue un .commit() ou un .rollback() sur la connexion.

SQL Server n'autorise pas l'exécution de CREATE DATABASE dans une telle transaction, nous devons donc avoir la connexion en mode autocommit avant d'émettre de telles instructions. Cela peut être accompli lorsque la connexion est ouverte ...

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

... ou en passant en mode autocommit si la connexion est déjà établie:

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

merci beaucoup .. ça marche ... – userbb