我有一个包含多个插入语句(1000 +)的.sql文件,我想将此文件中的语句运行到我的Oracle数据库中。
现在,我使用带有odbc的python连接到我的数据库,其中包含以下内容:
import pyodbc
from ConfigParser import SafeConfigParser
def db_call(self, cfgFile, sql):
parser = SafeConfigParser()
parser.read(cfgFile)
dsn = parser.get('odbc', 'dsn')
uid = parser.get('odbc', 'user')
pwd = parser.get('odbc', 'pass')
try:
con = pyodbc.connect('DSN=' + dsn + ';PWD=' + pwd + ';UID=' + pwd)
cur = con.cursor()
cur.execute(sql)
con.commit()
except pyodbc.DatabaseError, e:
print 'Error %s' % e
sys.exit(1)
finally:
if con and cur:
cur.close()
con.close()
with open('theFile.sql','r') as f:
cfgFile = 'c:\\dbinfo\\connectionInfo.cfg'
#here goes the code to insert the contents into the database using db_call_many
statements = f.read()
db_call(cfgFile,statements)
但是当我运行它时,我收到以下错误:
pyodbc.Error: ('HY000', '[HY000] [Oracle][ODBC][Ora]ORA-00911: invalid character\n (911) (SQLExecDirectW)')
但该文件的所有内容仅为:
INSERT INTO table (movie,genre) VALUES ('moviename','horror');
在db_db_call(cfgFile,statements)之前添加print '<{}>'.format(statements)
我得到结果(100 +):
<INSERT INTO table (movie,genre) VALUES ('moviename','horror');INSERT INTO table (movie,genre) VALUES ('moviename_b','horror');INSERT INTO table (movie,genre) VALUES ('moviename_c','horror');>
感谢您抽出时间阅读本文。
答案 0 :(得分:1)
现在有点澄清 - 你有很多单独的SQL语句,例如INSERT INTO table (movie,genre) VALUES ('moviename','horror');
然后,你有效地在cur.executescript()
之后比当前状态(我不知道pyodbc
是否支持DB API的那部分,但是任何原因,你不能只执行执行到数据库本身?
答案 1 :(得分:0)
使用read()函数读取文件时,也会读取文件末尾的结束行(\ n)。我认为你应该使用db_call(cfgFile,statements [: - 1])来消除结束行。