Python Berkeley DB/SQLite
因为BerkeleyDB可以使用SQLite的接口,所以Python能不能用sqlite模块来连接BerkeleyDB呢?
这篇帖子建议使用其他方法,但可能是在接口同步之前写的。适合Berkeley DB的最佳Python模块是什么?
可以得到一个简单的连接字符串。如果有已知的问题,请务必告诉我。我正在研究这个话题。
我在Linux和Windows上使用Python 2.7。
3 个回答
根据Oracle BSDDB 的文档,你可以让 BsdDB 生成一个可以替代 sqlite3 的库。理论上来说,这样你就可以用这个库来替代标准的 sqlite3 库,然后使用 sqlite3 的 Python 模块。
不过要注意,支持 SQLite API 的 BsdDB 版本是受SleepyCat 许可证约束的,这意味着你要么得给 Oracle 付费,要么得把你的项目做成开源项目(这两种选择其实都没什么不好,但你得做出选择)。
在win32上构建和合并库是个挑战 :)
我的假设是:
- python27(我用的是ActiveState的python,但python.org的也应该没问题),放在c:\python27
- visual studio 2010专业版(我觉得express版也可以用)
下载bdb和pysqlite(这次我下载的是2.6.3),放在c:\bdb
,然后解压bdb,这样你会得到:
C:\bdb\db-5.2.36
接着进入C:\bdb\db-5.2.36\build_windows
,选择Berkeley_DB_vs2010.sln
,将配置选为Static Release
,然后构建它。
你需要在这里得到libdb52s.lib
和libdb_sql52s.lib
:
C:\bdb\db-5.2.36\build_windows\Win32\Static Release
现在在c:\bdb
解压pysqlite,进入C:\bdb\pysqlite-2.6.3
,并按照以下方式编辑setup.cfg
:
[build_ext]
include_dirs=C:\bdb\db-5.2.36\lang\sql\generated
library_dirs=C:\bdb\db-5.2.36\build_windows\Win32\Static Release
define=SQLITE_OMIT_LOAD_EXTENSION
确保删除libraries=这一行。我需要把它们添加到setup.py中,因为由于静态链接,我们需要指定多个库。如果有人知道如何在setup.cfg中指定一个列表,请告诉我 :)
现在打开setup.py
,找到第191行,把:
libraries=libraries
替换为:
libraries=['libdb_sql52s', 'libdb52s', 'ws2_32', 'advapi32'],
打开vs2010命令提示符(在visual studio工具菜单中)
进入c:\bdb\pysqlite
set DISTUTILS_USE_SDK=1
set MSSdk=1
python setup.py build
# ignore errors about manifests, just make sure _sqlite.pyd is built
# make same tests of the linux instructions
python setup.py bdist_wininst
will make the .exe installer in dist subdir
根据这里的建议 https://forums.oracle.com/forums/thread.jspa?threadID=2302793,我在linux x86_64上用python27尝试了一下,下面是制作静态版本的步骤,因为我怀疑你的系统里没有bdb sqlite的接口。
首先,下载 db-5.2.36.tar.gz。
tar xzvf db-5.2.36.tar.gz
cd db-5.2.36/build_unix/
CFLAGS="-fPIC" ../dist/configure --enable-static --disable-shared --enable-sql-compat
# you need -fPIC to build the python ext of pysqlite
make
make prefix=/tmp/bdb install
接着,从 http://code.google.com/p/pysqlite/ 获取 pysqlite2 的副本,我是用hg checkout的方式。然后在setup.cfg文件的build_ext部分添加一些内容(那里还有两行被注释掉的代码,你可以重复使用它们)。
include_dirs=/tmp/bdb/include
library_dirs=/tmp/bdb/lib
然后进入pysqlite目录:
python setup.py build
python setup.py install
或者不安装的情况下:
cd build/lib.linux-x86_64-2.7
python
from pysqlite2 import dbapi2
conn = dbapi2.connect('test.db')
c = conn.cursor()
c.execute('bla bla bla sql')