django 找不到新的 sqlite 版本? (需要 SQLite 3.8.3 或更高版本(找到 3.7.17))

Posted

技术标签:

【中文标题】django 找不到新的 sqlite 版本? (需要 SQLite 3.8.3 或更高版本(找到 3.7.17))【英文标题】:django can't find new sqlite version? (SQLite 3.8.3 or later is required (found 3.7.17)) 【发布时间】:2019-09-04 13:11:45 【问题描述】:

我已经将一个 django 项目克隆到 Centos 7 vps 并且我现在正在尝试运行它,但是在尝试 migrate 时出现此错误:

$ python manage.py migrate
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

当我检查sqlite的版本时,它是3.7.17,所以我从sqlite网站下载了最新版本并用旧版本替换了它,现在当我版本它时,它给出了:

$ sqlite3 --version
3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7

当我尝试迁移项目时,我收到与以前完全相同的消息,这意味着找不到较新的版本。我是 linux 新手,不胜感激。

【问题讨论】:

独立的 sqlite3 可执行文件的版本无关紧要,重要的是 Python 库的版本。 @DanielRoseman 哦。那么我该如何更新呢?我试过pip install pysqlite并安装了它,但由于我有python 3,它抱怨:> Python 3不支持pysqlite。使用Python 3时,请使用标准库中的sqlite3模块。 这能回答你的问题吗? ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version) 【参考方案1】:

检查使用的是哪个版本的 SQLite Python:

$ python
Python 3.7.3 (default, Apr 12 2019, 16:23:13) 
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.27.2'

对我来说,新版本的 sqlite3 在 /usr/local/bin 中,所以我不得不重新编译 Python,告诉它到那里看:

sudo LD_RUN_PATH=/usr/local/lib ./configure --enable-optimizations
sudo LD_RUN_PATH=/usr/local/lib make altinstall

【讨论】:

这到底是怎么做的?我安装了python3.7.7,运行的sqlite版本是3.7.17。【参考方案2】:

我在CentOS 7.6 和Python 3.7.3 版本中遇到了同样的错误。我认为您正在使用 Django 2.2.* 某个版本。在最新的Django 2.2 中,他们更改了SQLIte 版本,这就是您的问题的原因。

这是Django 2.2 中关于SQLite 的release notes。

SQLite 支持的最低版本从 3.7.15 增加到 3.8.3。

所以我找到了解决这个问题的 3 个步骤,


降级 Django 版本

因此您可以使用此命令安装最新版本的Django 2.1,这意味着您将降级您的Django 版本。

pip install Django==2.1.*

Upgrading SQLite on CentOS to 3.8.3 or Later

或者您也可以按照以下步骤操作以保持最新版本Django。我直接从Upgrading SQLite on CentOS to 3.8.3 or Later文章中得到步骤。

您可以从here下载最新的sqlite版本。

wget https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz
tar zxvf sqlite-autoconf-3280000.tar.gz
./configure
make
sudo make install

我们已经安装到最新版本,但问题是一样的。这里,

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.7.17'

在article 中,他们提到了LD_RUN_PATHLD_LIBRARY_PATH 路径。

然后确保使用LD_RUN_PATH 环境变量再次编译python。 最好在LD_LIBRARY_PATH 上使用此变量。 使用LD_LIBRARY_PATH - 每当运行 python 时,它都会查找具有该路径的链接库。 我们想要的是在链接时 - 编译时将库编译成 python。

所以基于article,我们可以做类似的事情,

cd /opt/Python-x.y.z
LD_RUN_PATH=/usr/local/lib  ./configure
LD_RUN_PATH=/usr/local/lib make
LD_RUN_PATH=/usr/local/lib make altinstall

然后再试一次,

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.31.1'

我们开始吧,他们提到的一件事,

如果您不使用 LD_RUN_PATH,那么您必须确保为每个要运行 python 的用户将 LD_RUN_PATH 环境变量设置为 /usr/local/lib - 这真的很烦人。


testing a Django 2.2 website with SQLite3 on CentOS 7

这与上一个相同,基于LD_LIBRARY_PATH 方法。这是article的步骤,

$ wget https://www.sqlite.org/2018/sqlite-autoconf-3240000.tar.gz
$ tar zxvf sqlite-autoconf-3240000.tar.gz
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
$
$ python3.6 -c "import sqlite3; print(sqlite3.sqlite_version)"
3.7.17
$
$ export LD_LIBRARY_PATH=/usr/local/lib
$ python3.6 -c "import sqlite3; print(sqlite3.sqlite_version)"
3.24.0

如果最后两个步骤不起作用,请在下方评论您遇到的错误,我会为您找到另一个解决方案。

【讨论】:

SQLlite 版本要求在 Django 2.2.x 中确实发生了变化是正确的,但是如果有人正在克隆他们已经部署在其他地方的项目,只需安装 Django 2.1.x 而不是 2.2.x 或如果他们的项目需要 2.2 或更高版本,更高版本根本不会帮助他们。此外,2.1 现已结束生命周期。 最后一步对我有用。谢谢! 不客气@ManzurulHoqueRumi,很高兴听到这个消息。 嗨,我正在使用安装了 brew for linux 的 python 版本。你碰巧知道如何在那里实施这个解决方案吗? 选项 2 对我来说就像一个魅力,可以从旧 Mac OSX 10.9 机器上的源代码安装 Python 版本 3.9.6。添加此评论,以防万一它可以帮助任何从 Mac 来到这里的人【参考方案3】:

我也遇到了同样的问题,我为此苦苦挣扎了一段时间。对我来说,最好的解决方案是在 settings.py 文件中注释掉 DATABASES 部分。

由于我不想使用 SQLite 数据库,因此问题不再存在。稍后您可以使用对您有效的 db 更新 DATABASE 信息。

【讨论】:

这里也一样。 SQLite 似乎是 Django 的默认“DBMS”。如果您只是设置您的项目,您可以按照建议将该部分注释掉,然后切换到您选择的 DBMS。 如果你打算使用 postgresql 作为数据库,这似乎是最简单的方法。【参考方案4】:

我用以下代码补丁解决了类似的情况。按照我在自己的 centos7 上使用的这些步骤操作,一切都应该没问题。 请记住让您的centos7知道您正在调用python3而不仅仅是python,否则它将调用默认的python2,然后在您的virtualenv中出现一系列错误。

安装python3(从源代码):

cd ~
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
tar xJf Python-3.7.3.tar.xz
cd Python-3.7.3
./configure
make && make install
export PATH=$HOME/opt/python-3.7.3/bin:$PATH

然后运行:source .bash_profile

确认人

python3 --version
Python 3.7.3 

安装你的 sqlite3(从源代码):

$ cd ~
$ wget https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
$ tar zxvf sqlite-autoconf-3290000.tar.gz
cd sqlite-autoconf-3290000

$./configure --prefix=$HOME/opt/sqlite
$ make && make install

现在这也是你应该记住要做的,因为 centos7 知道在哪里寻找你的 python3 而不是默认为 python2。在您的.bash_profile 上复制并粘贴这段代码或相应地编辑路径:

export PATH=$HOME/opt/sqlite/bin:$PATH
export LD_LIBRARY_PATH=$HOME/opt/sqlite/lib
export LD_RUN_PATH=$HOME/opt/sqlite/lib

通过运行使其永久化:source .bash_profile 你已经完成了sqlite3 version >= 3.8。通过以下方式确认:

sqlite3 --version 
3.29.0 2019-07-10 17:32:03

然后就可以继续使用python3安装django-2.2等python3模块了。

python3.7 -m pip3 install virtualenv

(myvenv37)[me@test my_project]$ python3.7 -m pip3 install django
Successfully installed django-2.2.3 pytz-2019.1 sqlparse-0.3.0

记住,是

PYTHON3.7 -m pip3 install MODULE

(myvenv37)[me@test my_project]$ python3.7 manage.py runserver 

并且服务器应该正在运行。

所以,总而言之,在上面的例子中是migrate,& 应该是这样的:

(venv)[me@test my_project]$ python3.7 manage.py migrate

【讨论】:

【参考方案5】:

django 2.2需要sqlite版本>= 3.8.3

所以解决方案是更新您的 sqlite

    从sqlite3下载,选择source_code版本 tar -zxvf sqlite-xxx.tar.gz && cd xx ./configure && make && make install mv /usr/bin/sqlite3 /usr/bin/sqlite3.bak mv xxx/sqlite3 /usr/bin/sqlite3 export LD_LIBRARY_PATH="/usr/local/lib" 并写入~/.bashrc

测试1:

sqlite3 --version 

应该是你的版本

测试2:

$python
>>> import sqlite3
>>> sqlite3.sqlite_version

应该是你的版本

【讨论】:

请指定完整路径,我按照你提供的说明,安装后sqlite3在哪里,找不到可运行的sqlite3。在输出Libraries have been installed in: /usr/local/lib下方安装cmd显示当我在上面的目录上运行ls -l时,下面的文件列出libsqlite3.a libsqlite3.la libsqlite3.so -> libsqlite3.so.0.8.6 libsqlite3.so.0 -> libsqlite3.so.0.8.6 libsqlite3.so.0.8.6。请指导 你这样做了吗?:mv /usr/bin/sqlite3 /usr/bin/sqlite3.bak 你能解释一下第6步吗?那是在做什么?我是否将其作为命令运行,然后将其复制到 bashrc 中?命令是做什么的,bashrc是做什么的?【参考方案6】:

另一种选择是使用原子回购

wget -O - http://updates.atomicorp.com/installers/atomic |sh
yum install  atomic-sqlite
LD_LIBRARY_PATH='/opt/atomicorp/atomic/root/usr/lib64/' python3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.8.5'

【讨论】:

【参考方案7】:

我最近遇到了同样的问题 我的解决方案是在 68 左右更改源代码 site-packages\django\db\backends\sqlite3\base.py 行到目前为止没有副作用。

def check_sqlite_version(): 如果 Database.sqlite_version_info

【讨论】:

嗨。有人决定禁用旧版本是有充分理由的,因为它不支持所有操作。 对于某人来说可能存在原因,但不是错误。这是最好的方法!请务必记录下来。【参考方案8】:

由于这是关于 Centos7,你可以使用 Fedora 包来升级 Centos sqlite 包:

wget https://kojipkgs.fedoraproject.org//packages/sqlite/3.8.11/1.fc21/x86_64/sqlite-3.8.11-1.fc21.x86_64.rpm

sudo yum install sqlite-3.8.11-1.fc21.x86_64.rpm

(来自:https://www.reddit.com/r/linuxadmin/comments/c9hy5w/trying_to_upgrade_sqlite_3717_to_version_38_on/ezrtbkm/?utm_source=reddit&utm_medium=web2x&context=3)

这似乎可行,尽管我不确定这样做是否真的是解决问题的理想方法。我想如果你实际上没有使用 SQLite,那么这至少通过了版本检查,这样你就可以工作了。

【讨论】:

恕我直言,这是最好和最有用的解决方案。 +1【参考方案9】:

如果继续强制安装 sqlite 3.8.3 或更高版本,您只会因为 multilib 和其他不兼容等错误而变得更糟。正如 Theo 评论的那样,最好的方法是在 sqlite3/base.py(django 中的文件)上注释第 66 行,该行会触发名为 check_sqlite_version() 的方法。

这应该只是警告您使用的是次要补丁而不是引发异常(配置不当)。

PD:请务必记录下来!

【讨论】:

这是我的首选解决方案,因为 Centos 7 出于某种原因需要特定版本的 SQLite,所以我只是禁用了检查。【参考方案10】:

我在 Amazon Linux 2 实例上使用上述解决方案时遇到了问题,我发现通过我的各种更新尝试安装的内容导致了版本冲突。 最初我有这个:

$ python3 --version
Python 3.7.9
$ python3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.7.17'
>>> exit()

并且sudo yum install sqlite-3.8.11-1.fc21.x86_64.rpm 安装失败并显示以下消息:

我通过以下步骤解决了它:

sudo yum list | grep sqlite

这两个软件包因冲突而阻止更新。

sudo yum autoremove sqlite-devel卸载无关包。

sudo yum install sqlite-3.8.11-1.fc21.x86_64.rpm更新版本。

sudo yum list | grep sqlite

更新的 sqlite 包的新列表:

$ python3
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.8.11'
>>> exit()

【讨论】:

这对我有帮助,谢谢【参考方案11】:

经过几个小时的搜索,我在虚拟环境中使用一个命令解决了这个问题:

pip install pysqlite3-binary

你可以查看githubhere和文章(有点过时)here。

我还发现here,您应该将以下代码行放入您的 settings.py 中:

__import__('pysqlite3')
import sys
sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')

但对我来说,没有它也可以。

【讨论】:

【参考方案12】:

我在这里回答了这个问题:ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)

我通过使用以下命令升级我的 sqlite3 版本解决了这个问题:

cd ~ && wget https://www.sqlite.org/2020/sqlite-autoconf-3320100.tar.gz && tar xvfz sqlite-autoconf-3320100.tar.gz && cd sqlite-autoconf-3320100 && ./configure && make && make install

我正在使用 ElasticBeanstalk 进行设置,因此我在 .ebextensions 文件夹中添加了一个 .config 文件并将其放入其中:

option_settings:
  aws:elasticbeanstalk:application:environment:
    LD_LIBRARY_PATH: "/usr/local/lib"
commands:
  01_upgrade_sqlite:
    command: "cd ~ && wget https://www.sqlite.org/2020/sqlite-autoconf-3320100.tar.gz && tar xvfz sqlite-autoconf-3320100.tar.gz && cd sqlite-autoconf-3320100 && ./configure && make && make install"

非常感谢 Bejür 在此处添加 LD_LIBRARY_PATH 环境变量以使其正常工作。

【讨论】:

以上是关于django 找不到新的 sqlite 版本? (需要 SQLite 3.8.3 或更高版本(找到 3.7.17))的主要内容,如果未能解决你的问题,请参考以下文章

安装 Django 2.0.2 找不到版本

pdo sqlite 找不到驱动程序... php 文件未处理

消息 - 找不到安装的python-django或python3-django版本

Elastic Beanstalk,Django 部署错误,找不到满足要求的版本 pkg-resources==0.0.0

Django:找不到页面(404)

如何修复“错误:找不到模块'@endb/sqlite'”