..

Utiliser Django avec une base de données Postgres

Sqlite vs PostgreSQL

Par défaut, Django est configuré pour utiliser une base de données Sqlite. SQLite est une petite base de données sous forme de fichier. C’est une solution légère et pratique pour faire du développement et tester son application avec de faible volume.

La base de données Sqlite utilise un fichier db.sqlite3 présent à la racine de votre projet Django. Avec un client Sql (je vous conseillle l’excellent DBeaver) vous pouvez visualiser le contenu et exécuter des requêtes SQL. Pour configurer votre connexion JDLC a une base Sqlite vous devrez avoir cette configuration :

jdbc:sqlite:<PATH PROJET>db.sqlite3
Path:<PATH PROJET>

Pour une vrai utilisation en environnement réel, vous allez devoir passer sur une véritable base de données. PostgreSQL est une base open source très performante et très complète.

configuration Postgres

Nous allons utiliser PostgreSQL comme base de données avec Django, en remplacement de SQLite.

Nous partons du postulat que votre base de données Postgres est déjà installée. vous pouvez vous reporter à la documentation de postgres pour l’installer

création d’un schéma pour notre application Django

Nous allons créer un schéma et un utilisateur postgres dédié pour notre projet.

nous nous connectons à la base de données avec le compte admin. Attention, après cette commande le mot de passe de l’admin vous sera demandé

#connection à la base de données Postgres sur la base de données par défaut
psql -U postgres

#création de la base dédiée à notre projet
CREATE DATABASE <projet>;

#création d'un nouvel utilisateur
CREATE USER <utilisateur> WITH PASSWORD '<password>';

#on précise que l'encoding par défaut de notre utilisateur sera de l'utf8
ALTER ROLE <utilisateur> SET client_encoding TO 'utf8';

#recommandation de django pour configurer notre base de données
ALTER ROLE <utilisateur> SET default_transaction_isolation TO 'read committed';
ALTER ROLE <utilisateur> SET timezone TO 'UTC';

#accorde les droits à notre nouvel utilisateur sur notre nouvelle base de données
GRANT ALL PRIVILEGES ON DATABASE <projet> TO <utilisateur>;

#permet à notre nouvel utilisateur de créer un nouveau schéma. Utile si vous voulez exécuter des tests
ALTER USER <utilisateur> CREATEDB;

Utilisation de la base postgres dans Django

Nous allons utiliser le driver psycopg2-binary pour faire communiquer Django avec la base de données.

Dans ma configuration, j’utilise le bash Ubuntu dans Windows 10. La 1ère étape est d’installer le driver python-psycopg2 sur l’environnement Ubuntu

sudo apt-get install python-psycopg2

Nous ajoutons cette librairie dans les dépendances de pipenv

pipenv install psycopg2-binary

et nous allons modifier notre fichier settings.py pour indiquer à notre application django d’utiliser maintenant postgres en lieu et place de sqlite

nous allons commenter l’ancienne définition de notre connection et mettre la nouvelle

#DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
#}

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '<base de données>',
        'USER': '<utilisateur>',
        'PASSWORD': '<password>',
        'HOST': 'localhost',
        'PORT': '',
    }
}

si maintenant vous redémarrer votre application par la commande python migrate.py runserver, Django devrait vous indiquer que la base de données n’est pas synchronisée avec votre application et qu’il convient d’exécuter un migrate.

La commande makemigrations permet de créer les scripts à exécuter dans votre bases en fonctions de vos méthodes Model. Normalement, dans le cas d’une migration simple sans modification du modèle, cette coommande ne devrait rien faire.

python manage.py makemigrations

la commande migrate exécute en base les définitions de vos modèles et de vos applications installées

python manage.py migrate

Normalement, tout fonctionne et vous utilisez maintenant une base Postgres en lieu et place de la base Sqlite native