3

我正在尝试通过fdb模块将一个大型 SQL 文件(15k+ 语句)导入使用 Python 的新本地 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()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 文档中读到的内容,我必须使用 SQL 方言 3 才能在表模式中使用 BIGINT 数据类型。我已经使用fdb.create_database()默认参数正确设置了数据库 SQL 方言 3,但我仍然需要设置客户端 SQL 方言,我不知道我在哪里以及如何做到这一点。我在 OS X 上使用 Firebird 2.5.2 和 Python 2.7.2。

4

3 回答 3

1

据我所知,fdb应该默认为方言 3,但您可以使用连接属性 dialect=3 显式指定它,请参见连接到数据库中的示例 2 。奇怪的是,虽然 Firebird 中没有方言 0 这样的东西。

如果这确实解决了问题,我建议您在问题跟踪器中提交一个错误,因为驱动程序应默认为方言 3:http ://tracker.firebirdsql.org/browse/PYFB

于 2013-08-10T07:50:23.247 回答
0

将大型 sql 文件导入 firebird 数据库的更好方法是使用isql

于 2013-08-10T05:23:48.160 回答
0

isql -user sysdba -pass

不是 100% 确定上面是完全正确的语法

isql -user sysdba -pass test.fdb < test.sql

于 2013-08-11T20:52:05.683 回答