使用pypyodbc运行多个存储过程时结果不完整
我正在运行一个相对简单的Python脚本,这个脚本的目的是读取一个文本文件,文件里每一行都有一个存储过程。脚本应该先执行第一行的存储过程,然后再执行第二行的,以此类推。执行这些存储过程后,应该会填充到一个特定的表格里。
所以我遇到的问题是,这些存储过程没有把所有应该填充到表格里的结果都填进去。例如,如果我的文件内容是:
exec myproc 'data1';
exec myproc 'data2';
其中,myproc 'data1' 应该会在另一个表格里填充大约100条记录,而myproc 'data2' 应该会再填充大约50条记录。但实际上,我最后只得到了大约9条结果——第一条存储过程得到了5条,第二条得到了4条。
我知道这些存储过程是有效的,因为如果我通过OSQL运行同样的SQL文件(包含这些存储过程),我能在另一个表格里得到正确的约150条记录,所以显然问题出在我的脚本上。
这是我用来执行的代码:
import pypyodbc
conn = pypyodbc.connect(CONN_STR.format("{SQL Server}",server,database,user,password))
conn.autoCommit = True
procsFile = openFile('otherfile.txt','r+')
#loop through each proc (line) in the file
for proc in procsFile:
#run the procedure
curs = conn.cursor()
curs.execute(proc)
#commit results
conn.commit()
curs.close();
conn.close();
procsFile.close();
我在想,这可能和存储过程没有提交有关……或者其他什么原因?老实说,我不太明白为什么只有5条记录被提交,而不是100条。
我不知道。任何帮助或建议都非常感谢。
1 个回答
2
有几个地方需要检查。首先,你要确认一下你的data1到底是一个字符串'data1',还是你想要data1的值?如果你想要字符串'data1',那么你需要在它周围加上引号。这样你要执行的字符串看起来会是这样的:
exec_string = 'exec my_proc \'data1\';'
在你的情况下,你开启了自动提交,同时你也手动提交了整个连接。
我建议你把自动提交那一行注释掉:
#conn.autoCommit = True
然后把conn.commit()改成在游标上执行:
curs.commit()
可以简化成一行代码:
conn.cursor().execute('exec myproc \'data1\';').commit()
另外,你在Python代码行末尾加的分号(;)其实是多余的,可能会在你的循环中引起一些奇怪的问题。(不过SQL的分号可以保留。)