SQLite和Python 2.X之间的关系

时间:2013-04-17 23:03:55

标签: python python-2.7 sqlite

我对sqlite3和python 2.x

之间的关系感到有点困惑

这是输出:

$ python
Python 2.7.2+ (default, Jul 20 2012, 22:12:53) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.7.7'

'3.7.7'应该是我的Ubuntu操作系统上的sqlite版本。

然而,当我尝试

sqlite3 test.db 
bash: sqlite3: command not found

表示此计算机上未安装sqlite3。

然后我如何使用PRAGMA语句,如“PRAGMA encoding =”UTF-8“;”在python中创建数据库时?

1 个答案:

答案 0 :(得分:4)

首先:

  

'3.7.7'应该是我的Ubuntu操作系统上的sqlite版本。

没有。它是Python构建的sqlite库的版本。

如果Python是针对静态库构建的,那么没有理由期望它与您系统上的任何其他内容相关联。即使它是针对共享库构建的,它也不会拥有与发行版的默认sqlite包使用的共享库相同(尽管通常会这样)。

而且,即使Python 是针对你的发行版默认共享库的同一个共享库构建的:Ubuntu和许多发行版一样,允许你安装大多数libfoo.so共享库而不安装foo命令行工具。

特别是,如果您查看Ubuntu软件包(至少是最新版本),libsqlite3软件包中有sqlite共享库,而pythonsqlite3都依赖于在那个libsqlite3包裹上。

因此,如果您需要sqlite3命令行工具,则必须安装它;你没有通过安装Python自动获得它。


同时

  

有没有办法在python代码中使用PRAGMA encoding =“UTF-8”?

不确定。 PRAGMA只是影响会话其余部分的SQL语句。无论是在命令行工具中执行它,还是在Python execute命令中执行它,或者通过加载SQL脚本等都无关紧要。只需执行它。

但是,正如您在评论中指出的那样,根据the docs,除非您可以在连接到数据库之前运行,否则此特定编译指示将不起作用。因为DB-API 2.0(Python sqlite3模块和大多数其他Python数据库模块都是为了构建的API)没有任何方法在未连接状态下执行语句,所以没有简单的方法来解决这个问题。

当然,您可以查看Python的各种备用(通常不是经过良好测试,速度较慢)的sqlite3实现,或者将the source分叉并修改为pysqlite(定期的模块)作为sqlite3)包含在stdlib中。

如果你想这样做,要查看的地方是connection.c中的pysqlite_connection_init功能。您可能不希望添加通用的预连接pragma支持,而是通过另一个参数控制编码到connect的方法。请参阅sqlite3的{​​{3}}文档,了解您可以在此处做些什么。 (然后你可能想提交一个bug并提交补丁。它不会进入Python 2.x,但是在pysqlite中被接受的任何内容最终都会以Python 3.x结束。)

但是,更容易实现您想要的方法正是您尝试做的事情:在Python之外创建数据库。只需以您喜欢的方式安装sqlite3包(apt-get,其中一个GUI包装器,无论如何)并使用它。


最后一件事:据我所知,根据您的版本,Python的模块将显式使用UTF-8,或使用默认编码,即UTF-8。所以,你不需要在这里做任何事情。