将大型SQL文件导入本地Firebird数据库

时间:2013-08-09 22:46:18

标签: python firebird

我正在尝试通过fdb模块将大型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)

我还没有找到更好的方法来做到这一点......(比如在 sqlite3 模块中使用一种executescript(),每次调用都会执行多个语句。

它适用于前几个语句,而不是停止并引发异常:

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。

3 个答案:

答案 0 :(得分:1)

据我所知,fdb默认为方言3,但您可以使用连接属性dialect = 3明确指定它,请参阅Connecting to a database中的示例2。奇怪的是,在Firebird中没有方言0这样的东西。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

isql -user sysdba -pass

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

isql -user sysdba -pass test.fdb< TEST.SQL