Python Berkeley DB/Sqlite

6
由于BerkeleyDB可以使用SQLite API,那么Python可以使用sqlite模块连接到BerkeleyDB。本文建议使用其他方法,但其可能是在API同步之前编写的。 这里 可以找到一个简单的连接字符串。如果有任何已知问题,请务必发布。我正在探索此主题。 在Linux和Windows上使用Python 2.7。

我正在进行一项调查,你认为你为什么需要这个?保持相同的API并不会使数据库文件本身更具可移植性,每次迁移到新主机时都必须重复非标准编译过程。使用比Sqlite3更丰富的数据库非常简单,所有主要数据库都有DBApi兼容绑定。 - SingleNegationElimination
调查的答案:每个人都有自己的用例和开发路径。 - Merlin
我在询问您的使用情况,因为您可能正在寻找解决该特定情况的方案。 - SingleNegationElimination
3个回答

4
如建议所述(https://forums.oracle.com/forums/thread.jspa?threadID=2302793),我已在Linux x86_64上使用Python27进行了尝试。这里是制作静态版本的步骤,因为我怀疑您的发行版没有bdb sqlite api。

下载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中切换目录(cd):

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')

4

在win32上构建和合并库是具有挑战性的 :)

我的假设:

  • python27 (我有ActiveState python,但python.org也应该可以) 位于 c:\python27
  • visual studio 2010 professional (我认为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

1
+1 "在win32上构建和合并库是具有挑战性的 :)" - Merlin

3
根据OracleBSDDB文档,你可以强制BsdDB生成一个sqlite3替代库,然后(理论上)你将能够使用这个库来替换标准的sqlite3库,然后使用sqlite3 python模块。但是,请注意,使用支持SQLite API的BsdDB版本需要遵守SleepyCat许可证,这将迫使你支付费用给Oracle或成为开源项目(这两种解决方案都不是真正糟糕的,但你必须选择)。

关于费用,如果仅使用BSDDB,我需要支付费用吗?BSDDB不是开源的,类似于MySQL。 - Merlin
@Merlin:我更新了我的回答,并附上了BsdDB许可证的链接。 - Cédric Julien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接