0

我对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中创建数据库时?

4

1 回答 1

4

第一的:

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

不,这是构建 Python 的 sqlite 库的版本。

如果 Python 是针对静态库构建的,则没有理由期望它以任何方式与系统上的其他任何东西相关联。即使它是针对共享库构建的,它也不必发行版的默认sqlite包使用的共享库相同(尽管通常是这样)。

而且,即使 Python针对作为发行版默认共享库的相同共享库构建的:Ubuntu 与许多发行版一样,允许您在不安装命令行工具libfoo.so的情况下安装大多数共享库。foo

特别是,如果您查看 Ubuntu 软件包(至少对于最近的版本),软件包中有 sqlite 共享库libsqlite3,并且两者都python依赖sqlite3于该libsqlite3软件包。

所以,如果你想要sqlite3命令行工具,你必须安装它;您不会通过安装 Python 自动获得它。


同时:

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

当然。APRAGMA只是影响会话其余部分的 SQL 语句。无论您是在命令行工具中执行它,还是在 Pythonexecute命令中,或者通过加载 SQL 脚本等方式执行它都没有关系。只需执行它。

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

当然,您可以查看 Python 的各种替代(通常没有经过很好的测试,而且速度较慢)sqlite3 实现,或者 fork 并将源代码修改为pysqlite(定期包含在 stdlib 中的模块sqlite3)。

如果你想这样做,要看的地方pysqlite_connection_initconnection.c. 您可能不想添加通用的 pre-connect pragma 支持,而是通过另一个参数来控制编码的方法connect。请参阅open文档sqlite3以了解您可以在此处进行哪些有用的操作。(然后你可能想提交一个错误并提交一个补丁。它永远不会进入 Python 2.x,但任何在 pysqlite 中被接受的东西最终都会在 Python 3.x 中结束。)

但是做你想做的更简单的方法正是你想要做的:在 Python 之外创建数据库。只需sqlite3以您最喜欢的方式安装软件包(apt-getGUI 包装器之一,等等)并使用它。


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

于 2013-04-17T23:21:34.743 回答