Python 脚本中不可能在本地数据库上连接 Firebird

Firebird connection on a local database impossible within a Python script

我可以通过以下命令使用 Firebird ISQL 工具 (Firebird 3.0.4) 连接到我的 Firebird 数据库: connect "C:\Documents\database.db" user 'USER' password 'PASSWORD';

当我想在 Python 脚本(Python v3.7.7 on a Windows10 64 位)中执行此操作时,在包括 fdb v2.0.1 甚至虚拟环境中firebirdsql v1.1.3,我不行而且系统报错

import fdb
con = fdb.connect(database="C:\Documents\database.db", user='USER' password='PASSWORD'')

DatabaseError: ('Error while connecting to database:\n- SQLCODE: -902\n- Unable to complete network request to host "xnet://Global\FIREBIRD".', -902, 335544721)

con = fdb.connect(host='localhost', database="D:\Documents\database.db", user= 'USER' password= 'PASSWORD'')

DatabaseError: ('Error while connecting to database:\n- SQLCODE: -902\n- Unable to complete network request to host "localhost".\n- Failed to establish a connection.', -902, 335544721)

con = fdb.connect(dsn="localhost:C:\Documents\database.db", user='USER' password='PASSWORD'')

DatabaseError: ('Error while connecting to database:\n- SQLCODE: -902\n- Unable to complete network request to host "localhost".\n- Failed to establish a connection.', -902, 335544721)

import firebirdsql
con = firebirdsql.connect(host='localhost', database="D:\Documents\database.db", user='USER' password='PASSWORD'')

如果你有任何想法,欢迎你,因为我被困住了。

该错误表明FDB加载的fbclient.dll不提供Firebird Embedded,并且您的机器上没有Firebird Server运行。

要解决此问题,您必须:

  1. 启动 Firebird 服务器(通过启动其服务或 运行 firebird -a
  2. 如果您想使用 Firebird Embedded 而不是 Firebird Server,请将 FDB 指向提供 Firebird Embedded
  3. fbclient.dll

第 2 点可以通过多种方式完成。在我的回答中,我假设使用 C:\Program Files\Firebird\Firebird-3.0.5.33220-0_x64 中安装的 Firebird 3。从 Firebird 3 开始,普通的 Firebird Server 安装也提供了 Firebird Embedded。要指向 Firebird Embedded,您可以执行以下操作:

  1. 将 Firebird 安装目录添加到 PATH 环境变量(确保它在 之前 %SystemRoot\System32/C:\Windows\System32 列出。在正常的 Firebird 安装中,没有 Firebird Embedded 的 fbclient.dll 安装在 System32 文件夹中,如果加载了它,您将无法使用 Firebird Embedded。
  2. 使用fdb.load_api加载客户端库:
    fdb.load_api('C:/Program Files/Firebird/Firebird-3.0.5.33220-0_x64/fbclient.dll')
    
    这需要在第一次使用fdb.connect之前完成,否则将使用通过正常搜索路径找到的库
  3. 使用 fb_library_name 连接指定客户端库 属性:
    con = fdb.connect(dsn='C:/path/to/yourdatabase.fdb', user='sysdba', password='masterkey', 
        fb_library_name='C:/Program Files/Firebird/Firebird-3.0.5.33220-0_x64/fbclient.dll')
    
    此 属性 需要在使用 FDB 建立的第一个连接上指定。尽管 属性 的存在表明这是 'per connection',但 FDB 将始终使用第一个加载的客户端库(本质上,它的工作方式就好像您在 [=25] 之前调用了 load_api =]).

如果您使用的是 Firebird 2.5 或更早版本,则需要下载特定的 Firebird 2.5 Embedded 软件包,并指向其 fbembed.dll 而不是 fbclient.dll。对于 Firebird 2.5 Embedded,将其位置添加到路径将不起作用,除非您将其 fbembed.dll 重命名或复制为 fbclient.dll.