我使用的是蟒蛇与pywin32的adodbapi编写脚本,创建一个SQL服务器数据库及其所有相关表格、看法和程序。问题是,蟒蛇的DBAPI要求标。执行()被包裹在一个交易,只是直致力于通过光标。commit(),并且你不可能执行的下降或创建数据库的声明在一个用户的交易。任何想法如何得到解决?

编辑:

似乎没有什么可以类似于一个自动提交参数的连接()方法的adodbapi或其标()方法。我很乐意去使用pymssql而不是adodbapi,除了它截断炭和varchar数据类型255符。

我没有尝试这之前张贴;这是回溯.

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
有帮助吗?

解决方案

该adodbapi连接的对象 conn 会自动开始一个新的交易之后的每个承诺如果数据库支持的交易。DB-API需要自动提交给会默认情况下处于关闭状态并且它允许一个API的方法来打开它,但是我没有看到一个在adodbapi.

你可能能够使用 conn.adoConn 财产破解围绕这一点,使用ADO api而不是DB-API带你出去的任何交易。让我知道如果这个工作:

conn.adoConn.CommitTrans()
cursor.execute('CREATE DATABASE ...')
conn.adoConn.BeginTrans()

这里的来源 adodbapi commit()方法.

其他提示

“问题是Python的DBAPI要求将cursor.execute()包装在一个仅由cursor.commit()提交的事务中”

“并且您无法在用户事务中执行删除或创建数据库语句。”

我不确定所有这些是否真的适用于所有 DBAPI 接口。

由于您没有显示错误消息,因此 ADODBAPI 接口可能并非如此。你真的尝试过吗?如果是这样,您收到什么错误消息?

连接可能不 总是 创建“用户交易”。您经常可以打开连接 autocommit=True 获得 DDL 风格的自动提交。

另外,您可能需要考虑使用不同的连接来运行 DDL。

http://pymssql.sourceforge.net/ 例如,显示 DDL 是这样执行的。

import pymssql
conn = pymssql.connect(host='SQL01', user='user', password='password', database='mydatabase')
cur = conn.cursor()
cur.execute('CREATE TABLE persons(id INT, name VARCHAR(100))')

创建事务外的实际分贝。我不熟悉Python,但必须有执行数据库上给定的字符串用户的方式,使用与实际创建数据库命令。然后使用adodbapi做所有的表等,并提交该事务。

我试图在adodbapi(例如DBCC CHECKDB ...)和joeforker的忠告运行命令帮助一点有同样的问题。我仍然有问题是adodbapi自动启动一个事务,所以没有办法在一个事务之外执行的东西。

在结束我结束了禁用adodbapi的提交这样的行为:

self.conn = adodbapi.connect(conn_str)
# rollback the transaction that was started in Connection.__init__()
self.conn.adoConn.RollbackTrans() 
# prevent adodbapi from trying to rollback a transaction in Connection.close()
self.conn.supportsTransactions = False

据我所知,这会重新启用标准的SQL Server自动提交功能,即,每个SQL语句自动提交。不足之处是没有办法,我能再次交易(目前),如果我wan't运行在一个事务中的东西,因为Connection.commit()不会做任何事情的时候supportsTransactions == False

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top