首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Python创建SQL Server数据库

通过Python创建SQL Server数据库
EN

Stack Overflow用户
提问于 2009-05-12 17:55:47
回答 4查看 10K关注 0票数 3

我正在使用Python和pywin32的adodbapi编写一个脚本来创建SQL Server数据库及其所有相关的表、视图和过程。问题在于,Python要求将cursor.execute()包装在仅由cursor.commit()提交的事务中,并且不能在用户事务中执行drop或create database语句。有什么办法解决这个问题吗?

编辑:

对于adodbapi的connect()方法或其cursor()方法,似乎没有任何类似于自动提交参数的东西。我很乐意使用pymssql而不是adodbapi,除非它将char和varchar数据类型截断为255个字符。

在发帖之前,我确实尝试过这一点;下面是回溯。

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-12 19:10:19

如果数据库支持事务,那么在每次提交后,adodbapi连接对象conn都会自动启动一个新事务。DB-API要求默认情况下关闭自动提交,并允许API方法将其重新打开,但我在adodbapi中没有看到这样的情况。

您也许能够使用conn.adoConn属性来解决这个问题,使用api而不是DB-API来使您脱离任何事务。如果有效,请让我知道:

代码语言:javascript
复制
conn.adoConn.CommitTrans()
cursor.execute('CREATE DATABASE ...')
conn.adoConn.BeginTrans()

这是adodbapi commit() method的源代码。

票数 1
EN

Stack Overflow用户

发布于 2009-05-12 18:55:14

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

“并且不能在用户事务中执行drop或create database语句。”

我不确定所有的DBAPI接口都是这样的。

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

连接可能并不总是创建“用户事务”。您通常可以使用autocommit=True打开连接以获得DDL式的自动提交。

此外,您可能希望考虑使用不同的连接来运行DDL。

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

代码语言:javascript
复制
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))')
票数 2
EN

Stack Overflow用户

发布于 2009-05-12 18:28:29

在事务之外创建实际的数据库。我不熟悉python,但必须有一种方法来在数据库上执行用户给定的字符串,并与实际的create db命令一起使用。然后使用adodbapi执行所有的表,等等,并提交该事务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/854008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档