Использование SQLite3 с Django 2.2 и Python 3.6.7 на Centos7

Я переношу свой код 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, чтобы начать разработку кода и 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 не загружает серверную часть базы данных SQLite3, когда обнаруживает, что она находится в производстве на AWS (использует производственную базу данных Mysql в качестве серверной части, когда установлен флаг переменной среды PRODUCTION).

Правильно ли я понимаю проблему и приемлем ли мой подход и реализация?

Я чувствовал, что перекомпиляция python была огромной тратой времени, и, если честно, возможно, было бы быстрее установить локальную версию mysql и перестать тратить время на sqlite... но так приятно просто скопировать или выгрузить файл, перенести и загрузить данные для начала заново.


person Patrick Scott Best    schedule 03.04.2019    source источник
comment
Рекомендуется сохранять одинаковую конфигурацию для среды разработки и рабочей среды. Если вы используете mysql в производстве, вам лучше использовать его в разработке. Я сомневаюсь, что миграция данных между различными движками баз данных приносит какое-либо удобство.   -  person Михаил Павлов    schedule 05.06.2019
comment
Хотя в целом я согласен с тем, что лучше всего поддерживать тесную связь рабочей среды и среды разработки, существуют сценарии, в которых это может оказаться невозможным. Приведу несколько примеров: 1) При тестировании конфиденциальных наборов данных. 2) При разработке определенного представления или функциональности, которую можно реализовать с помощью одноразовых данных.   -  person Patrick Scott Best    schedule 06.06.2019
comment
Что вы имеете в виду под тестированием? Модульное тестирование?   -  person Михаил Павлов    schedule 07.06.2019
comment
Функциональное или функциональное тестирование, когда вам не нужна вся копия базы данных, чтобы доказать результаты ваших изменений кода, будет успешным, когда оно будет запущено в производство. Подмножество или образец, экспортированный из производственной базы данных в тестовую базу данных. Это может снизить риск заражения и ускорить выполнение пакетных процессов. Не понравились последние результаты? Удалите файл sqlite3 и замените его снимком, сделанным до эксперимента. Так намного проще. Вот почему мы здесь, верно? sqlite3 для разработки. YMMV.   -  person Patrick Scott Best    schedule 07.06.2019
comment
Я не уверен, правильно ли я вас понимаю. Разве это не относится к mock данным?   -  person Михаил Павлов    schedule 07.06.2019
comment
Итак, в конце у вас есть настройки с настройкой testing.sqlite, верно?   -  person Михаил Павлов    schedule 07.06.2019
comment
В целях тестирования у вас может быть команда инициализации, которая импортирует необходимые начальные данные в базу данных, используя для удобства FactoryBoy.   -  person Михаил Павлов    schedule 07.06.2019


Ответы (1)


Я использую 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 успешно создана!

person shmakovpn    schedule 14.06.2019