我将我的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'
>>>

我在本地Centros7工作站上使用单独的开发帐户,并发出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以反映以下内容:
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 production数据库作为后端)。
我对问题的理解是否正确,我的方法和实现是否可以接受?
我觉得重新编译python是在浪费大量的时间,老实说,站在本地的mysql版本上并停止用sqlite浪费时间可能会更快…但是,为了一个新的开始,只复制或转储一个文件、迁移和加载数据就太好了。
如果你认为我的问题或意见是值得的,请给我一个打击!
此外,是否有1500名或以上的知名人士请创建标签“Django-2.2”,以便正确标记此问题?
谢谢您!

最佳答案

我在用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数据库!

07-26 09:42
查看更多