【问题标题】:django can't find new sqlite version? (SQLite 3.8.3 or later is required (found 3.7.17))django 找不到新的 sqlite 版本? (需要 SQLite 3.8.3 或更高版本(找到 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 新手,不胜感激。

【问题讨论】:

标签: python django sqlite centos7


【解决方案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.6Python 3.7.3 版本中遇到了同样的错误。我认为您正在使用 Django 2.2.* 某个版本。在最新的Django 2.2 中,他们更改了SQLIte 版本,这就是您的问题的原因。

这是Django 2.2 中关于SQLiterelease notes

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

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


  • 降级 Django 版本

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

pip install Django==2.1.*

或者您也可以按照以下步骤操作以保持最新版本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 - 这真的很烦人。


这与上一个相同,基于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

    1. sqlite3下载,选择source_code版本
    2. tar -zxvf sqlite-xxx.tar.gz && cd xx
    3. ./configure && make && make install
    4. mv /usr/bin/sqlite3 /usr/bin/sqlite3.bak
    5. mv xxx/sqlite3 /usr/bin/sqlite3
    6. 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 环境变量以使其正常工作。

        【讨论】:

          猜你喜欢
          • 2020-08-24
          • 2020-06-24
          • 1970-01-01
          • 2020-07-04
          • 2020-12-11
          • 2022-11-04
          • 2019-10-24
          • 2020-06-14
          • 2022-07-03
          相关资源
          最近更新 更多