3

fdbモジュールを使用して、Python を使用して大きな SQL ファイル (15k 以上のステートメント) を新しいローカル Firebird データベースにインポートしようとしています。

import fdb

db = fdb.create_database("CREATE DATABASE 'test.fdb'")
sql_str = open('test.sql').read()
in_trans = False

for stmt in sql_str.split(';'):
    if stmt.startswith('INSERT') and not in_trans:
        in_trans = True
        db.begin()
    else:
        in_trans = False
        db.commit()

    db.execute_immediate(stmt)

これを行うためのより良い方法は見つかりませんでした...(呼び出しごとに複数のステートメントを実行する一種のexecutescript()in sqlite3モジュールを使用するなど)。

最初のいくつかのステートメントでは機能しましたが、その例外を停止して発生させました。

fdb.fbcore.DatabaseError: ('Error while executing SQL statement:\n- SQLCODE: -104\n- Dynamic SQL Error\n- SQL error code = -104\n- Client SQL dialect 0 does not support reference to BIGINT datatype', -104, 335544569)

Firebird のドキュメントで読んだことから、テーブル スキーマで BIGINT データ型を使用できるようにするには、SQL ダイアレクト 3 を使用する必要があります。データベースの SQL ダイアレクト 3 をfdb.create_database()デフォルトの引数で正しく設定していますが、クライアントの SQL ダイアレクトを設定する必要があり、どこでどのように行うのかわかりません。OS X で Firebird 2.5.2 と Python 2.7.2 を使用しています。

4

3 に答える 3

1

私の知る限り、fdbデフォルトは方言 3 ですが、接続プロパティ dialect=3 を使用して明示的に指定できます。データベースへの接続 の例 2 を参照してください。奇妙なことに、Firebird には方言 0 のようなものはありません。

これで問題が解決する場合は、ドライバがデフォルトでダイアレクト 3 に設定されているはずなので、Issue Tracker にバグを報告することをお勧めします: http://tracker.firebirdsql.org/browse/PYFB

于 2013-08-10T07:50:23.247 に答える
0

大きなSQLファイルをfirebirdデータベースにインポートするより良い方法は、isqlを使用することです

于 2013-08-10T05:23:48.160 に答える