创建一个SQL服务器数据库从蟒蛇
-
21-08-2019 - |
题
我使用的是蟒蛇与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
。