在 Python 脚本中无法连接本地数据库的 Firebird

hga*_*ger 2 python firebird fdb

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

当我想在Python脚本(Windows10 64位上的Python v3.7.7)中,在包括fdb v2.0.1甚至firebirdsql v1.1.3的虚拟环境中执行此操作时,我不能并且系统地得到一个错误。

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

DatabaseError: ('连接到数据库时出错:\n- SQLCODE: -902\n- 无法完成对主机“xnet://Global\FIREBIRD”的网络请求。', -902, 335544721)

或者

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

DatabaseError: ('连接到数据库时出错:\n- SQLCODE: -902\n- 无法完成对主机“localhost”的网络请求。\n- 无法建立连接。', -902, 335544721)

或者

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

DatabaseError: ('连接到数据库时出错:\n- SQLCODE: -902\n- 无法完成对主机“localhost”的网络请求。\n- 无法建立连接。', -902, 335544721)

或者

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

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

Mar*_*eel 7

该错误表明fbclient.dllFDB 加载的文件不提供 Firebird Embedded,并且您的计算机上没有运行 Firebird Server。

要解决这个问题,您必须:

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

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

  1. 将 Firebird 安装目录添加到PATH环境变量中(确保它列在/之前 )。在正常的 Firebird 安装中,不带 Firebird Embedded 的文件安装在该文件夹中,如果加载了该文件,则无法使用 Firebird Embedded。%SystemRoot\System32C:\Windows\System32fbclient.dllSystem32
  2. 用于fdb.load_api加载客户端库:
    fdb.load_api('C:/Program Files/Firebird/Firebird-3.0.5.33220-0_x64/fbclient.dll')
    
    Run Code Online (Sandbox Code Playgroud) 这需要在第一次使用之前完成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')
    
    Run Code Online (Sandbox Code Playgroud) 需要在使用 FDB 建立的第一个连接上指定此属性。尽管该属性的存在表明这是“每个连接”,但 FDB 将始终使用加载的第一个客户端库(本质上,它的工作方式就像您在load_api之前调用一样connect)。

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