django - 在 Centos7 上将 SQLite3 与 Django 2.2 和 Python 3.6.7 结合使用

标签 django sqlite python-3.6 pipenv django-2.2

我正在将我的 Django 代码从 2.1.7 直接移动到新的 Django 2.2。我在 Centos7 开发环境中遇到的唯一问题是我的本地开发数据库(sqlite3)版本与我的 Python 3.6.7 不兼容。

我从“manage.py runserver”得到的错误是:

django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later

我无法使用其他版本的 Python,因为这是 AWS elasticbeanstalk 支持的最大版本。 Python 3.6.7 似乎附带版本的 sqlite 模块:

>>> import sqlite3
>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.7.17'
>>> 

我在本地 Centos7 工作站上使用单独的开发帐户并发出 pipenv shell 以开始我的代码开发和 IDE。

我发现的唯一解决方法是手动下载 SQLite3 autoconf 版本 3.27.2 并使用以下命令手动编译到该开发帐户主文件夹中:

wget https://www.sqlite.org/2019/sqlite-autoconf-3270200.tar.gz
gzip -d sqlite-autoconf-3270200.tar.gz
tar -xvf sqlite-autoconf-3270200.tar
cd sqlite-autoconf-3270200/
./configure --prefix=/home/devuser/opt/
make
make install

之后,我修改了我的 .bashrc 以反射(reflect)以下内容:

export LD_LIBRARY_PATH="${HOME}/opt/lib"

当我重新登录到我的 devuser 帐户时,这似乎可以解决问题。我的应用似乎可以使用我的本地开发数据库正确运行。

Python 3.6.7 (default, Dec  5 2018, 15:02:05)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
>>>import sqlite3
>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.27.2'

我的本​​地开发数据库是 SQLite,但是当我的 settings.py 感觉到它在 AWS 上生产时,它不会加载任何 SQLite3 数据库后端(当环境变量标志 PRODUCTION 被选中时,使用 Mysql 生产数据库作为后端)。

我对问题的理解是否正确,我的方法和实现是否可以接受?

我觉得重新编译 python 是一个巨大的时间浪费,老实说,建立本地 mysql 版本并停止使用 sqlite 浪费时间可能更快......文件、迁移和加载数据以重新开始。

最佳答案

我正在使用 Centos7 和 python36。

[shmakovpn@localhost ~]$ ldd /usr/lib64/python3.6/lib-dynload/_sqlite3.cpython-36m-x86_64-linux-gnu.so
linux-vdso.so.1 =>  (0x00007ffcafdf6000)
libsqlite3.so.0 => /lib64/libsqlite3.so.0 (0x00007f0adf439000)
libpython3.6m.so.1.0 => /lib64/libpython3.6m.so.1.0 (0x00007f0adef10000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0adecf4000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0ade927000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0ade723000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f0ade520000)
libm.so.6 => /lib64/libm.so.6 (0x00007f0ade21e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0adf903000)

这意味着python36使用/lib64/libsqlite3.so.0 在 python 控制台中它看起来像这样

>>> import sqlite3
>>> sqlite3.version
'2.6.0'
>>> sqlite3.sqlite_version
'3.7.17'

需要更换库,所以我们必须有它的新版本。有一种方法可以做到这一点。

wget http://www6.atomicorp.com/channels/atomic/centos/7/x86_64/RPMS/atomic-sqlite-sqlite-3.8.5-3.el7.art.x86_64.rpm
sudo yum localinstall atomic-sqlite-sqlite-3.8.5-3.el7.art.x86_64.rpm
sudo mv /lib64/libsqlite3.so.0.8.6{,-3.17}
sudo cp /opt/atomic/atomic-sqlite/root/usr/lib64/libsqlite3.so.0.8.6 /lib64

再次进入python控制台

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.8.5'

现在看起来好多了。让我们尝试创建 Django 项目并应用迁移

django-admin startproject sqlite3test
cd sqlite3test/
python manage.py migrate
    Operations to perform:
        Apply all migrations: admin, auth, contenttypes, sessions
    Running migrations:
        Applying contenttypes.0001_initial... OK
        ... and so on
ls -al | grep db
    -rw-r--r--.  1 shmakovpn shmakovpn 40960 апр 19 01:02 db.sqlite3

Sqlite3数据库创建成功!

关于django - 在 Centos7 上将 SQLite3 与 Django 2.2 和 Python 3.6.7 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55485858/

相关文章:

python - Django 教程 - 不正确配置异常(未安装 pytz)

django - 尝试在 settings.py 文件中设置 corsheaders 时

python - 删除日期时间函数中的时间?

sql - 将 AUTO INCREMENT 列添加到 Sqlite View

amazon-s3 - 使用 boto3 创建带有自定义 header 的 s3 预签名 url (put)

html - 将值从 Django View 传递到 AngularJS 插入的模板

sqlite - 使用 Golang 的 SQLite3

c++ - 更新与特定行号相关的每一列的值? sqlite sqlite3

gpio - 在 Python 3.6 中使用 RPi.GPIO

Python 在错误的行返回类型错误