是否可以在 Ubuntu 18.04 上安装 SQLite 3.24+?

pki*_*162 8 python sqlite python3 sqlite3 18.04

我正在尝试将我的 SQLite 版本更新到 3.24 或更高版本,以便 Python 应用程序可以使用新的“UPSERT”查询。我已经尝试了几个小时来做​​到这一点,但收效甚微。它拒绝更新过去3.22

我尝试过:

  • 使用 apt 安装和重新安装 sqlite/libsqlite3-dev(以及它的各种版本)

  • 从启动板下载包(例如 https://launchpad.net/ubuntu/+source/sqlite3/3.26.0-2)并尝试安装它们

  • 使用 Python pip 尝试更新 sqlite3

  • 添加一些 PPA 存储库以尝试从那里获取它

  • 从谷歌找到的其他各种建议

我没有尝试过的:

  • 从源代码构建 SQLite(这对我来说是最后的手段)

是否可以在 Ubuntu 18.04 上安装 SQLite 3.24+ 版本?如果是这样,是从源代码构建的唯一方法还是有一种简单的方法可以通过 apt(或类似的)获取更新的版本?

Dag*_*elf 4

以下是一些选项:

码头工人

这是 docker 的实际用例。没有带有最新 sqlite 的官方 Docker 镜像 - 但制作一个很容易:

$ mkdir sqlite333 && cd sqlite333
$ cat > Dockerfile
FROM ubuntu:groovy
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get -yq --no-install-recommends install sqlite3 python3 && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

WORKDIR /root
ENTRYPOINT python3.8 -c "import sqlite3; print(sqlite3.sqlite_version)"
Run Code Online (Sandbox Code Playgroud)

CtrlD保存,然后:

$ docker build -t sqlite333 .
$ docker run --rm -ti sqlite333
3.33.0
Run Code Online (Sandbox Code Playgroud)

要运行现有的应用程序,只需绑定安装它:

docker run --rm -ti -v /path/to/myapp:/tmp sqlite333 /tmp/myapp.py
Run Code Online (Sandbox Code Playgroud)

或者,您可以将其复制到 Dockerfile 所在的目录中,然后将其副本放置在实际映像中 - 但每次进行更改时都需要重建映像。

如果有一个具有正确版本的官方 Sqlite 映像,并且您已经安装并可以运行 Docker,那么您可以使用任何版本的 SQLite 以及任何其他版本的任何其他版本,例如整齐打包的。(来自https://hub.docker.com/r/nouchka/sqlite3

docker run --rm -ti -v `pwd`:/tmp nouchka/sqlite3 /tmp/myapp.py
Run Code Online (Sandbox Code Playgroud)

这会将当前目录安装在 docker 映像中的 /tmp 内,并运行从此 Dockerfile构建的映像- 您可以轻松修改该文件以安装 Python,并运行您喜欢的任何命令。

前门(社区)方法

您可以从使用相同 C 库的其他发行版(或版本)强制安装 .deb - 我通常在 Distrowatch 上搜索以找到这些文件- 但除了标准 C 库版本之外,可能还存在其他意外的依赖关系问题,因此您的“快速修复”从长远来看,如果不是彻底破坏操作系统的某些部分,那么结果可能不会那么快。

正确的方法是自愿花时间更新官方存储库 - 这样所有安全和兼容性问题都将有最好的方法找到正确的渠道,并且您有最好的机会寻求帮助社区维持事物向前发展。首先是联系当前的 Ubuntu SQLite 软件包维护者,了解可以采取哪些措施来帮助使其保持最新状态。https://launchpad.net/ubuntu/+source/sqlite3(3.33 实际上是最新 Ubuntu 的一部分,这就是上面 Dockerfile 搭载的原因)这个初始列表显示了 20 多个相关或依赖的包,暗示了旧版本可能滞后的原因:https://packages.ubuntu.com/search?keywords =sqlite3

从源代码编译

从源代码编译也不是那么麻烦 - 如果您掌握了步骤 - 那么让我们从 https://www.sqlite.org/download 来测试一下 SQLite 声称的“小、快、可靠”的名声。 html

$ wget https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz
$ tar -zxvf sqlite-autoconf-3330000.tar.gz
$  cd sqlite-autoconf-3330000/
$ ./configure
$ make -j4
Run Code Online (Sandbox Code Playgroud)

但这一切都在回答你所提出的问题。你真正的问题是:

我可以在 Ubuntu 18.04 下安装 SQlite 3.33 for Python 吗?

编辑: Python确实使用系统SQLite - 因此在按照上面编译它之后,将其安装在/ usr / local下,理论上你应该能够告诉它使用带有LD_RUN_PATH环境变量的特定SQLite,如下所示 - 但它不起作用:

$ sudo PREFIX=/usr/local make install
Run Code Online (Sandbox Code Playgroud)

通常会使用新的 SQLite:

$ LD_RUN_PATH=/usr/local/lib python3 
Run Code Online (Sandbox Code Playgroud)

但似乎 SQLite 或 Python3 还有更多功能,因为这还不够 - 如果您在系统范围内安装新版本,它可能会起作用(sudo PREFIX=/usr make install) - 但不建议这样做,因为它可能会破坏与其他系统应用程序的兼容性,并且破坏系统依赖关系,并且您的操作系统在更新时可能会覆盖它 - 您可以参考http://charlesleifer.com/blog/compiling-sqlite-for-use-with-python-applications/以获取更详细的说明,但不应该有需要,因为我复制了下面的要点。

考虑到这一点,docker 方法似乎不仅是一种可扩展和可维护的快速修复方法,而且实际上是首选方法 - 经过仔细检查,很明显 SQLite 实际上与主要 Python 代码库集成得更紧密,留下了唯一的选择如下编译您自己的Python 包。

另一种解决方案:编译Python

所以你真正想做的是编译你自己的 Python 副本

我很惊讶它的编译速度如此之快,即使是在我动力不足的笔记本电脑上。上面链接的指南非常详细,所以我不会重复任何内容,除了这里的主要步骤 - 简化:

# Follow the steps copied above to compile SQLite 3.33 - and then after the make, do:
$ sudo PREFIX=/usr/local make install

# Then compile Python
$ sudo apt-get build-dep python3.6 # thanks Ubuntu community!
$ git clone --depth=1 https://github.com/python/cpython
$ cd cpython
$ LD_RUN_PATH=/usr/local/lib ./configure CPPFLAGS="-I/usr/local/include/sqlite3" #updated
$ make -s -j4
# sudo PREFIX=/usr/local make install # if you like, which will install it in /usr/local/bin
# but you can just run it directly from the source directory too
Run Code Online (Sandbox Code Playgroud)

这应该会给你留下一个支持 SQlite 3.33 的 Python 二进制版本(或者你在 /usr/local 下安装的任何版本),你可以复制它,或者打包并复制,或者打包成 deb并复制,或者打包到您自己的 PPA 中以进行分发和 apt 安装。或者,如果有人已经这样做了,您可以在 Ubuntu launchpad 上搜索它

编辑:已测试并工作。在没有 LD_RUN_PATH 环境变量的情况下测试上述内容后,并注意到它仍然使用分发版本(在本例中为 3.22),很明显它没有被编译 -只是编译了它应该使用的库的路径,就像这样编译时一样。因此,重新编译 Python 可能没有必要,只需在操作系统打包版本上安装一个新的 SQLite 系统范围即可 - 考虑到打包版本可能会在更新时覆盖它,或者删除打包版本可能会破坏其他软件包的操作系统打包这取决于它,所以这不是一个很好的解决方案。)

(了解所有这些的简单方法是安装 Slackware 或 Gentoo,这就是我学习的方法。)

其他选项

可能有FlatpakSnappy选项,但截至撰写本文时尚未有人将其打包。


Car*_*teo 2

正如 Murphy 提到的,这个版本的 SQLite3 与官方 Ubuntu 18.04 绑定。我在 Azure 中创建了一个新的 Ubuntu 18.04.5 LTS,并尝试了一些操作,包括安装 Python3.7 和 Python 3.8,并且 SQLite 版本是相同的。

root@test-011:/home/carles# python3.8 -c "import sqlite3; print(sqlite3.sqlite_version)"
3.22.0
Run Code Online (Sandbox Code Playgroud)

我还尝试下载更新版本的预编译 SQLite 二进制文件,但它们都不起作用。

我想说,即使你让它工作,将你的程序分发到其他服务器也会很痛苦。我不建议您不要使用 LTS 版本提供的官方软件包,因为您不会获得这些软件包的升级和安全补丁。

因此,我认为最简单的方法是安装更新版本的 Ubuntu,或者可以使用更新的 Ubuntu 映像版本运行 Docker 实例,并在程序中尝试新功能。从源代码构建 SQLite3 不适合你,你必须从源代码 + SQLite3 构建 Python3。我的建议是:保持简单。