【发布时间】:2014-08-06 18:45:49
【问题描述】:
当我尝试使用 pyodbc 和 freetds 从 Linux 主机备份 MSSQL 数据库时,我目前遇到了一些问题。版本如下:
Python 2.7.6、pyodbc 3.0.7、freetds 0.91-2、Centos 6.5
我运行的代码如下(去掉了名字和密码等):
import pyodbc
conn = pyodbc.connect('DRIVER=FreeTDS;SERVER=<servername>;PORT=<port>;DATABASE=<database>;UID=<user>;PWD=<password>;TDS_Version=8.0;Autocommit=True;')
sql = "exec dbo.backupStashDB"
cursor=conn.cursor().execute(sql)
while cursor.nextset():
pass
conn.close()
我得到的错误信息是:
exec dbo.backupnameDB
Traceback (most recent call last):
File "soph_stash_db_bkp.py", line 6, in <module>
conn.execute(sql)
pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL Server]Cannot perform a backup or restore operation within a transaction. (3021) (SQLExecDirectW)')
无论我是“手动”运行命令还是通过存储过程(如本代码示例中所示)运行命令,我都会收到相同的消息。
我做了一些谷歌搜索,发现添加“Autocommit=True”的参考可以解决这个问题,但这似乎根本没有任何区别。
有人对此有什么有用的见解可以分享吗?
提前致谢,迈克
【问题讨论】:
-
DATABASE=<database>您使用的是目标数据库名称还是Master??应该是Master。 -
@M.Ali 感谢您的回复。我不确定我是否关注你,但我在连接字符串中将数据库名称交换为 Master,但我得到了以下错误。
pyodbc.ProgrammingError: ('42000', "[42000] [FreeTDS][SQL Server]Could not find stored procedure 'dbo.backupStashDB'. (2812) (SQLExecDirectW)"是我误会你的回复还是这个存储过程“放错地方了”? -
@SwedishMike 您收到的存储过程错误是由于
master中不存在该存储过程。您收到的原始错误不是由无效的数据库上下文引起的。使用您的原始代码备份并查看我对类似问题的回答 here。 -
@beargle 也非常感谢您的回复。我查看了您的回复,我看到您建议在其中添加
autocommit=True部分,或者我是否遗漏了其他内容?如果是这样,我的代码中确实有那个位,但我仍然收到交易错误? -
另一条评论,虽然这不是原因;你实际上想使用“TDS_Version=7.2;”在您的连接字符串中,每个 freetds.org/userguide/choosingtdsprotocol.htm
标签: python sql-server pyodbc freetds