使用pyodbc时,“在多语句事务中不允许CREATE ...语句”

问题描述 投票:4回答:1

我正在尝试使用pyodbc创建一个SQL Server数据库。

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无法在事务中运行。

那么有没有其他方法来使用python执行CREATE DATABASE命令?

python sql-server python-2.7 pyodbc
1个回答
7
投票

建立连接时,pyodbc根据Python的DB-API规范默认为autocommit=False。因此,当执行第一个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")
© www.soinside.com 2019 - 2024. All rights reserved.