Firebird笔记

Firebird笔记

目录

1   选用理由

我正在开发一个爬虫,原来使用的SQLite数据库的多线程并发操作很麻烦,我一直都没能找到比较好的方法来避免数据库锁定,所以在尝试了一个多月之后我最终放弃了。放弃之后使用了BerkeleyDB作为数据库,自己写接口。运行过程尽管还算很快,但是也有问题,就是多线程操作BerkeleyDB时会让Python解释器出现段错误而退出,这也是无法忍受的错误。

所以在权衡之后我最终还是决定捡起一度放弃的Firebird数据库。决定未来将其集成到我的爬虫当中。另外,我的另外一个产品也需要使用足够健壮的数据库服务器。

关于MySQL,我还是很信赖其稳定性的,使用感受也不错,但是在我的程序中并不需要复杂的权限控制,而且通过网络连接数据库的安全性和速度也让我很讨厌。所以选用了Firebird的嵌入式版本。

2   与Python的结合使用

Firebird的Python接口叫做KinterbasDB,支持所有版本的Firebird和部分版本的Interbase。尽管支持,但是对1.0、1.5、2.0版本的Firebird是使用不同的安装包来支持的。

在Windows 2000系统之下我使用了 kinterbasdb-3.2.win32-FB-2.0-py2.4.exe 来进行安装,版本为3.2,对应Firebird版本为2.0。双击然后一路继续就完成了。

3   安装Firebird的嵌入式版本

因为考虑到未来程序的可移植性,所以我坚决避免使用Firebird的安装包进行安装。在安装完成 KinterbasDB 之后尝试在Python中导入:

>>> import kinterbasdb

发生了错误,提示找不到DLL文件,然后我使用了压缩包 Firebird-2.0.0.12748-0_embed_win32.zip 。对缺少的DLL文件依次从压缩包中解压出来并放置到目录 C:Python24Libsite-packageskinterbasdb 目录中。因为我发现这个目录是可以被路径识别的,并且跟 KinterbasDB 的关系密切。如下几个文件是导入语句所必须的:

  • fbclient.dll :最初叫做 fbembeb.dll 需要复制过来以后该名为新名字的,否则 KinterbasDB 是不认的。
  • icuuc30.dll :不知道干什么的,反正必须要有。
  • icudt30.dll :不知道干什么的。
  • icuin30.dll :不知道干什么的。

这四个动态链接库的大小就已经达到了 3.68MB ,不过面前还是可以接受的。

在这样一番折腾之后就可以成功的导入了,做了一下dir,结果超长,此处也就略掉吧。FB支持的功能非常多,包括触发器、事务、存储过程之类的,这些东西在开源数据库当中是非常少有的。

4   《Firebird嵌入版本开发方案》笔记

Firebird的官方网站( http://www.ibphoenix.com )。这里还推荐了一个叫UIB的东西,网站是( http://www.progdigy.com/UIB/ )。原来用于Interbase的可视化管理工具IBExpert ( http://www.ibexpert.com )从某种程度上来说也可以用于Firebird。

拒作者说IBExpert好像是有限制的,所以推荐去 ftp://hdkej.8800.org 下载一个修改过的版本,没有限制。运行IBExpert新建数据库时服务器选择Local,Client Library选择fbclient.dll。

看来UIB是给Delphi使用的一套接口,Python的就免了。作者的调试过程发现不能让两个进程同时访问数据库。

5   博客 http://tb.blog.csdn.net 的Firebird使用 笔记

推荐下载IBExpert而已,另外就是FB内置了isql.exe在控制台进行数据库的基本操作。

6   《python2.4 连接firebird1.5 一个连接数据库的文件》笔记

作者使用Python2.4和KinterbasDB连接了FB数据库。首先是导入:

import kinterbasdb as kdb

初始化连接并返回连接对象:

conn=kdb.connect(dsn='lq:D:\\data\\aaa.FDB',user='sysdba',password='masterkey')
conn.text_factory=str

连接选项的dsn用来指定数据源,用户名密码sysdba:masterkey是默认的。第二行是用来避免 “Could not decode to UTF-8 column” 错误的。

因为很多时候程序需要随身携带数据库,所以需要使用相对路径,文中给出了获取当前路径的方法:

import os
ypath=os.path.abspath(os.path.dirname(sys.argv[0]))

如果需要通过列名来返回值,则可以作如下设置:

conn.row_factory=kdb.Row

通过ConfigParser模块支持INI格式的配置文件,如下是某配置文件:

[SQLFbDB]
dbname=data\aaa.FDB

如下是处理配置文件的代码:

import ConfigParser
config=ConfirParser.ConfigParser()
config.read('config.txt')
dbname=config.get('SQLFbDB','dbname')

7   《本地数据源:使用firebird数据库》笔记

Windows下的Firebird有classical和superserver两种版本。配置文件aliases.conf配置数据库别名,firebird.conf配置数据库参数如rootpath。

嵌入的FB数据库不再支持多用户访问和用户安全控制,不过对于本机程序来说很正常。

在.net下使用时有个连接选项叫server type,需要设置为1才是嵌入FB数据库。

8   Python-Chinese邮件列表上朋友的回复

  1. 安装KInterbasDB,会产生一个 lib\site-package\kinterbasdb 目录。

  2. 在kinterbasdb目录下新建一个embedded目录,然后将嵌入式的Firebird中的 fbembed.dllfirebird.msgib_util.dll 这3个文件放入embedded目录下。如果需要国际化支持,则同时复制intl子目录,这个目录包含 fbintl.dll 文件。

  3. fbembed.dll 文件改名为 fbclient.dll

  4. 这时就可以使用FB数据库了。

  5. KInterbasDB为了向后兼容,默认使用 mx.DateTime 模块,但是在Python2.4下并不需要而且多余。在Python标准库中的datetime模块更好用。需要用datetime替代mx.DateTime则按照如下修改:

    import kinterbasdb
    kinterbasdb.init(type_conv=200)

实际测试发现如果把几个动态链接库放在 embedded 目录中,则会提示动态链接库找不到。

Leave a Reply