Firebird笔记
Firebird笔记
- 1 选用理由
- 2 与Python的结合使用
- 3 安装Firebird的嵌入式版本
- 4 《Firebird嵌入版本开发方案》笔记
- 5 博客 http://tb.blog.csdn.net 的Firebird使用 笔记
- 6 《python2.4 连接firebird1.5 一个连接数据库的文件》笔记
- 7 《本地数据源:使用firebird数据库》笔记
- 8 Python-Chinese邮件列表上朋友的回复
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邮件列表上朋友的回复
-
安装KInterbasDB,会产生一个 lib\site-package\kinterbasdb 目录。
-
在kinterbasdb目录下新建一个embedded目录,然后将嵌入式的Firebird中的 fbembed.dll 、 firebird.msg 、 ib_util.dll 这3个文件放入embedded目录下。如果需要国际化支持,则同时复制intl子目录,这个目录包含 fbintl.dll 文件。
-
将 fbembed.dll 文件改名为 fbclient.dll 。
-
这时就可以使用FB数据库了。
-
KInterbasDB为了向后兼容,默认使用 mx.DateTime 模块,但是在Python2.4下并不需要而且多余。在Python标准库中的datetime模块更好用。需要用datetime替代mx.DateTime则按照如下修改:
import kinterbasdb kinterbasdb.init(type_conv=200)
实际测试发现如果把几个动态链接库放在 embedded 目录中,则会提示动态链接库找不到。