从Python创建SQL Server数据库

我正在使用Python和pywin32的adodbapi编写脚本来创建SQL Server数据库及其所有相关的表,视图和过程。问题是Python的DBAPI要求cursor.execute()包含在仅由cursor.commit()提交的事务中,并且您不能在用户事务中执行drop或create database语句。关于如何解决这个问题的任何想法? 编辑: 对于adodbapi的connect()方法或其cursor()方法,似乎没有类似于autocommit参数的任何内容。我很乐意使用pymssql而不是adodbapi,除了它将char和varchar数据类型截断为255个字符。 我在发布之前尝试过这个;这是追溯。
Traceback (most recent call last):
  File "demo.py", line 39, in <module>
    cur.execute("create database dummydatabase")
  File "C:Python26libsite-packagesadodbapiadodbapi.py", line 713, in execute
    self._executeHelper(operation,False,parameters)
  File "C:Python26libsite-packagesadodbapiadodbapi.py", line 664, in _executeHelper
    self._raiseCursorError(DatabaseError,tracebackhistory)
  File "C:Python26libsite-packagesadodbapiadodbapi.py", line 474, in _raiseCursorError
    eh(self.conn,self,errorclass,errorvalue)
  File "C:Python26libsite-packagesadodbapiadodbapi.py", line 60, in standardErrorHandler
    raise errorclass(errorvalue)
adodbapi.adodbapi.DatabaseError: 
--ADODBAPI
Traceback (most recent call last):
   File "C:Python26libsite-packagesadodbapiadodbapi.py", line 650, in _executeHelper
    adoRetVal=self.cmd.Execute()
   File "<COMObject ADODB.Command>", line 3, in Execute
   File "C:Python26libsite-packageswin32comclientdynamic.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()提交的事务中” “并且您无法在用户事务中执行drop或create database语句。” 我不确定所有这些对所有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,但必须有一种方法来在数据库上执行用户给定的字符串,并将其与实际的create db命令一起使用。然后使用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语句都会自动提交。缺点是,如果我不想在交易中运行某些东西,我就无法再次启动交易(因为当
supportsTransactions == False
Connection.commit()
将无效)。     

要回复问题请先登录注册