Python Berkeley DB/SQLite

6 投票
3 回答
3337 浏览
提问于 2025-04-17 07:54

因为BerkeleyDB可以使用SQLite的接口,所以Python能不能用sqlite模块来连接BerkeleyDB呢?

这篇帖子建议使用其他方法,但可能是在接口同步之前写的。适合Berkeley DB的最佳Python模块是什么?

可以得到一个简单的连接字符串。如果有已知的问题,请务必告诉我。我正在研究这个话题。

我在Linux和Windows上使用Python 2.7。

3 个回答

3

根据Oracle BSDDB 的文档,你可以让 BsdDB 生成一个可以替代 sqlite3 的库。理论上来说,这样你就可以用这个库来替代标准的 sqlite3 库,然后使用 sqlite3 的 Python 模块。

不过要注意,支持 SQLite API 的 BsdDB 版本是受SleepyCat 许可证约束的,这意味着你要么得给 Oracle 付费,要么得把你的项目做成开源项目(这两种选择其实都没什么不好,但你得做出选择)。

4

在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.liblibdb_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
4

根据这里的建议 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')

撰写回答