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()現在の状態よりも効果的です(pyodbcDB APIのその部分をサポートしているかどうかはわかりませんが、何らかの理由で、データベース自体に対して実行を実行することはできませんか?

于 2012-12-07T14:28:53.033 に答える
0

read()関数を使用してファイルを読み取ると、ファイルの最後の終了行(\ n)も読み取られます。エンドラインを削除するには、db_call(cfgFile、statements [:-1])を使用する必要があると思います。

于 2012-12-07T14:10:12.843 に答える