我正在尝试连接一个火鸟数据库与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)