【问题标题】:"CREATE ... statement not allowed within multi-statement transaction" when using pyodbc使用 pyodbc 时,“在多语句事务中不允许创建 ... 语句”
【发布时间】:2017-02-02 15:30:56
【问题描述】:

我正在尝试使用 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()

因为这个错误而失败

多语句事务中不允许创建数据库语句

失败是因为.execute 方法启动了一个事务,而CREATE DATABASE 不能在事务中运行。

那么还有其他方法可以使用 python 执行CREATE DATABASE 命令吗?

【问题讨论】:

  • 我刚试过。它不起作用..
  • 也试过了。它失败了
  • 那么您将不得不显示您的确切代码。相关问题herehere
  • 我的代码如下:

标签: python sql-server python-2.7 pyodbc


【解决方案1】:

在建立连接时,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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多