Each Answer to this Q is separated by one/two green lines.
I’ve cloned a django project to a Centos 7 vps and I’m trying to run it now, but I get this error when trying to
$ python manage.py migrate django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
When I checked the version for sqlite, it was 3.7.17, so I downloaded the newest version from sqlite website and replaced it with the old one, and now when I version it, it gives:
$ sqlite3 --version 3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7
Still when I try to migrate the project, I get the exact same message as before which means the newer version is not found. I’m new to linux and would appreciate any help.
The minimum supported version of SQLite is increased from 3.7.15 to 3.8.3.
So I found 3 steps to solve this problem,
- Downgrade Django Version
So you can install latest version of Django 2.1 by using this command, which mean you’re going to downgrade your
pip install Django==2.1.*
or you can followup below steps as well to keep the latest version
Django. I directly get the steps from Upgrading SQLite on CentOS to 3.8.3 or Later article.
You can download the latest
sqlite version from here.
wget https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz tar zxvf sqlite-autoconf-3280000.tar.gz ./configure make sudo make install
We’ve installed to the latest version, but the problem is same. Here,
>>> import sqlite3 >>> sqlite3.sqlite_version '3.7.17'
In the article, they’ve mentioned about
Then make sure to compile python again using the
It is better to use this variable over
LD_LIBRARY_PATH– whenever python is run it will look for linked libraries with that path.
What we want is for the libraries to be cooked into python at link time – compile time.
So based on the article, we can do the similar thing,
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
Then try again,
>>> import sqlite3 >>> sqlite3.sqlite_version '3.31.1'
Here we go, one thing they’ve mentioned,
If you do not use LD_RUN_PATH, then you have to make sure that the LD_RUN_PATH environment variable is set to /usr/local/lib for every user that is going to run python – which can be really annoying to do.
This is same as the previous one and based on
LD_LIBRARY_PATH approach. Here is the steps from the 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
If the last two steps didn’t work, please comment below with the error you got and I’ll find another solution for you.
I solved a similar situation with the following patches of code. Follow these steps that I used on my own centos7 & everything should be alright.
Just remember to let your centos7 know that you are calling
python3 not just
python otherwise it will call the default python2 followed by a series of errors in your
Installing python3 (from source):
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
python3 --version Python 3.7.3
Installing your sqlite3 (from source):
$ 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
Now this is what you should also remember to do for centos7 know where to look for your python3 and not defaulting to python2. On your
.bash_profile copy & past this piece of code or edit the paths accordingly:
export PATH=$HOME/opt/sqlite/bin:$PATH export LD_LIBRARY_PATH=$HOME/opt/sqlite/lib export LD_RUN_PATH=$HOME/opt/sqlite/lib
Make it permanent by running:
and you are done with
sqlite3 version >= 3.8. Confirm it by:
sqlite3 --version 3.29.0 2019-07-10 17:32:03
And then you can continue to use python3 to install python3 modules like django-2.2.
python3.7 -m pip3 install virtualenv (myvenv37)[[email protected] my_project]$ python3.7 -m pip3 install django Successfully installed django-2.2.3 pytz-2019.1 sqlparse-0.3.0
Remember, it is
PYTHON3.7 -m pip3 install MODULE
(myvenv37)[[email protected] my_project]$ python3.7 manage.py runserver
and the server should be running.
So, to conclude, in the case above it was
migrate, & should look like this:
(venv)[[email protected] my_project]$ python3.7 manage.py migrate
As this was about Centos7, you can use the Fedora package to upgrade the Centos sqlite package:
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
This seems to work, although I’m never sure if doing this is really an ideal solution to a problem or not. I guess if you’re not actually using SQLite, then this at least passes the version check and so gets you working.
django 2.2 need sqlite version >= 3.8.3
so the solution is update your sqlite:
- download from sqlite3, select source_code version
- 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"and write it into ~/.bashrc
should be your version
$python >>> import sqlite3 >>> sqlite3.sqlite_version
should be your version
To check which version of SQLite Python is using:
$ python Python 3.7.3 (default, Apr 12 2019, 16:23:13) >>> import sqlite3 >>> sqlite3.sqlite_version '3.27.2'
For me the new version of sqlite3 is in /usr/local/bin so I had to recompile Python, telling it to look there:
sudo LD_RUN_PATH=/usr/local/lib ./configure --enable-optimizations sudo LD_RUN_PATH=/usr/local/lib make altinstall
I had the same issue and I struggled with it for a while. For me the best solution was to comment out DATABASES section in settings.py file.
As I don’t want to use SQLite database then issue does not exist anymore. Later on you can update DATABASE information with the db that is valid for you.
I was having trouble with the above solutions on an Amazon Linux 2 instance and found that what was installed from my various attempts to update were causing version conflicts.
Initially I had this:
$ python3 --version Python 3.7.9 $ python3 >>> import sqlite3 >>> sqlite3.sqlite_version '3.7.17' >>> exit()
I resolved it by the following steps:
sudo yum list | grep sqlite
sudo yum autoremove sqlite-devel To uninstall the extraneous package.
sudo yum install sqlite-3.8.11-1.fc21.x86_64.rpm To update the version.
sudo yum list | grep sqlite
$ python3 >>> import sqlite3 >>> sqlite3.sqlite_version '3.8.11' >>> exit()
You will only get make it worse with errors like multilib and other incompatibilities if keeps forcing the installation of sqlite 3.8.3 or higher. Just as Theo commented, the best approach is to comment the line #66 on the sqlite3/base.py (file within django) that triggers the method named check_sqlite_version().
This should be just warning that you are using a minor patch instead of raise an Exception (ImproperlyConfigured).
PD: Just make sure to document it!
another option is to use atomic repo
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'
After few hours of searching I solved it using one command inside my virtual environment:
pip install pysqlite3-binary
I also found here that you should then place the following lines of code in your settings.py:
__import__('pysqlite3') import sys sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
but for me it worked without it.
I answered this question here: ImproperlyConfigured(‘SQLite 3.8.3 or later is required (found %s).’ % Database.sqlite_version)
I solved this issue by upgrading my version of sqlite3 using this 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
I am using ElasticBeanstalk for my setup, so I added a .config file to the .ebextensions folder and put this in it:
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"
Many thanks to Bejür for adding the LD_LIBRARY_PATH environment variable here in order to get it to work.
I make a fixed downgrade Django
pip3 install Django==2.1.*
i had recently same problem
My solution was to change source code site-packages\django\db\backends\sqlite3\base.py line around 68 So far no side effects.
if Database.sqlite_version_info < (3, 7, 3):
raise ImproperlyConfigured(‘SQLite 3.8.3 or later is required (found %s).’ % Database.sqlite_version)