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_PATH
和LD_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))的主要内容,如果未能解决你的问题,请参考以下文章
pdo sqlite 找不到驱动程序... php 文件未处理
消息 - 找不到安装的python-django或python3-django版本
Elastic Beanstalk,Django 部署错误,找不到满足要求的版本 pkg-resources==0.0.0