尝试连接Firebird 3.05数据库到Python (pandas)



我正在尝试连接一个火鸟数据库与Python。我已经用pyodbc:

试过了
import os
import pyodbc
server = '127.0.0.1/3050' 
database = 'Databse-Name' 
username = 'Username' 
password = 'password' 
cnxn = pyodbc.connect('DRIVER={Firebird/InterBase(r) 
driver};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()

我得到这个错误:

OperationalError: ('08004', "[08004] [ODBC Firebird Driver]无法连接到数据源:库'gds32.dll'加载失败(-904)(SQLDriverConnect);[08004] [ODBC Firebird Driver]无效的连接字符串属性(0)")

我不知道为什么他试图找到'gds32.dll'。在odbc连接中,我使用了这个驱动程序C:Program Files (x86)assfinet ams.5BINFB30x64fbclient.dll

我使用火鸟作为64位版本,所以我有点无能为力,因为'gds32.dll'中的32。

我不确定,如果它是正确的方式来尝试pyodbc。我愿意听取其他建议。

有谁知道为什么它不工作吗?

错误提到gds32.dll意味着它试图加载fbclient.dll,但这不起作用。然后它试图回退到gds32.dll。gds32.dll是历史上支持的,因为Firebird是22年前从InterBase派生出来的,而InterBase使用gds32.dll作为其客户端库。64位版本也称为gds32.dll。

问题是,除非C:Program Files (x86)assfinet ams.5BINFB30x64文件夹显式地在路径上,或者您配置了CLIENT连接属性,否则找不到库(或者可能是32位而不是64位)。

您需要64位的fbclient.dll。如果C:Program Files (x86)assfinet ams.5BINFB30x64确实是64位火鸟(那么C:Program Files (x86)是错误的位置),您需要在CLIENT连接属性中指定64位客户端库的路径,或者您可以从Windows 64位火鸟安装的命令提示符启动instclient i f,或者使用火鸟安装程序进行客户端安装。或者,您可以下载Windows 64位Firebird的zipkit并使用其fbclient.dll。

您还应该考虑为Python使用Firebird驱动程序之一,而不是使用ODBC。你可以选择:

  • firebird-driver - using fbclient.dll
  • FDB -使用fbclient.dll(已弃用并被firebird-driver取代)
  • firebirdsql(又名pyfirebirdsql) -一个纯Python驱动程序(没有本地依赖)

另外,我不确定Gordon关于使用SQLAlchemy的建议是否正确,但我建议对此进行调查(尽管在下面介绍SQLAlchemy可能会使用FDB或firebird-driver,因此您仍然需要一个适当的64位客户端库来加载)。

如果您打算将pandas与SQLite以外的数据库一起使用,则应该使用SQLAlchemy(参考:此处)。在您的示例中,您将使用sqlalchemy-firebird方言。

编辑回复:对原始答案的评论

因为我们连接到localhost,我们可以预期Firebird已经安装,因此客户端工具可用(这对于默认安装是正确的)。在这种情况下,以下操作可以在Windows 8.1测试机上运行:

import pandas as pd
import sqlalchemy as sa
# note the r"" string
engine = sa.create_engine(r"firebird://SYSDBA:masterkey@localhost/C:ProgramDataassfinetassfinet ams.5Individuell 2022DB0 - Stand 2022_02-10.FDB")
df = pd.read_sql_query("SELECT * FROM my_table", engine)

尽管更好的方法是像这样构建连接URL

connection_url = sa.engine.URL.create(
"firebird",
username="SYSDBA",
password="masterkey",
host="localhost",
database=r"C:ProgramDataassfinetassfinet ams.5Individuell 2022DB0 - Stand 2022_02-10.FDB",
)
engine = sa.create_engine(connection_url)

相关内容

  • 没有找到相关文章

最新更新