1

我有一个带有多个插入语句( 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');

编辑

print '<{}>'.format(statements)在 db_db_call(cfgFile,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');>

感谢您花时间阅读本文。

4

2 回答 2

1

现在它有点澄清了 - 你有很多单独的 SQL 语句,例如INSERT INTO table (movie,genre) VALUES ('moviename','horror');

然后,您cur.executescript()比当前状态更有效(我不知道是否pyodbc支持 DB API 的那部分,但是出于任何原因,您不能只执行对数据库本身的执行吗?

于 2012-12-07T14:28:53.033 回答
0

当您使用 read() 函数读取文件时,文件末尾的结束行 (\n) 也会被读取。我认为您应该使用 db_call(cfgFile,statements[:-1]) 来消除结束行。

于 2012-12-07T14:10:12.843 回答