Note

Cette documentation est en cours de redaction. Pour toutes questions n’hésitez pas à nous envoyer un email sur community@risefor.org ou à ouvrir un ticket directement sur git

Gestion de la base de données

Avertissement

Assurez vous d’avoir bien activer votre environnement virtuel pour éviter toutes erreurs de packages.

Pour ce faire, à la racine de vos fichiers Risefor, tapez:

. env/bin/activate

Configuration du type de base à utiliser

Dans le fichier settings.py vous avez une variable nommée dataBaseType vous permettant de choisir le type de base de données à utiliser.

Pour l’instant elle accepte 2 options :

  1. Dev : Permet de créer et utiliser une base de données sqlite3

  2. postgresql : Permet d’utiliser une base de données postgresql

...
dataBaseType = 'dev or postgresql'
if dataBaseType == 'dev':
    ...

Tips pour la production

Nous conseillons l’utilisation de la base postgresql dans un contexte de production, mais vous pouvez utiliser la sqlite3 (on l’a fait pendant longtemps)

Utilisation de sqlite3

Pour utiliser un ficher db.sqlite3 tout ce que vous avez à faire c’est de lancer une migration.

1. Modification du fichier settings.py

Avertissement

evolution du système de fonctionnement, informez ces paramètres dans le fichier .env

Assurer vous que la variable nommée dataBaseType dans le ficher settings.py est bien égale à « dev »

...
dataBaseType = 'dev'
if dataBaseType == 'dev':
    ...

2. Création de la base de données

Positionnez vous dans le dossier united4earth/ et tapez :

python3 manage.py migrate

Vous devriez voir les migrations dérouler, laissez faire.

3. Vérification

Une fois terminé, tout devrait rouler ! :) Si ce n’est pas déjà fait, vous pouvez créer un compte admin en tapant la commande suivante

python3 manage.py createsuperuser

et naviguer dans la section admin (example.com/admin/) et ajouter une action pour valider le bon fonctionnement de la base de données.

Erreur « database readonly »

Si, en vous connectant à l’admin vous avez une erreur « database is readonly », assurez vous que le user publique (généralement www-data) a bien accès au ficher db.sqlite3

Pour ce faire:

  1. Naviguez dans le dossier /united4earth

  2. Assurez vous que les fichiers « appartiennent » au user publique

chown -R www-data:www-data .
  1. Rédemarrez le serveur

  2. Rafraichissez la page, normalement l’erreur aura disparue

Utilisation de Postgresql

1. Installation de postgres et création de la base

  1. Installer les packages nécessaires

sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
  1. Création de l’utilisateur et de la base de données

Connectez vous à postgres

sudo -u postgres psql

puis tapez les commandes suivantes :

CREATE DATABASE risefor_database;

CREATE USER risefor WITH PASSWORD 'Mdp a mettre';

ALTER ROLE risefor SET client_encoding TO 'utf8';
ALTER USER risefor WITH SUPERUSER; ## Faire ceci en cas de soucis de droits seulement
ALTER ROLE risefor SET default_transaction_isolation TO 'read committed';
ALTER ROLE risefor SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE risefor_database TO risefor;
\q;

Vous avez crée une base de données nommée risefor_database accessible à l’utilisateur risefor

2. Modifications du fichiers settings.py

Pour commencer, assurez vous d’avoir bien activé le mode « postgres » en modifiant le contenu de la variable dataBaseType comme ceci:

...
dataBaseType = 'postgresql'
if dataBaseType == 'dev':
    ...

Ensuite vous devez préciser les informations de connexion à la base de données.

Pour ceci, rendez-vous dans la section qui se trouve juste après la ligne elif dataBaseType == 'postgresql':

Voici le block que vous devez personnaliser :

'NAME': 'database_name',
'USER': 'user_name',
'PASSWORD': 'user_password',
'HOST': 'backend_url',
'PORT': '',

Et un exemple utilisant les informations de l’étape précédente :

'NAME': 'risefor_database',
'USER': 'risefor',
'PASSWORD': 'Mdp a mettre',
'HOST':'localhost', # default
'PORT': '', # default

3. Lancez la migration

Normalement tout est prêt pour utiliser la base de données psql ! 🎉

Positionnez vous dans le dossier united4earth/ et tapez :

python3 manage.py migrate

Vous devriez voir les migrations dérouler, laissez faire.

Une fois terminé, tout devrait rouler ! :) Si ce n’est pas déjà fait, vous pouvez créer un compte admin en tapant la commande suivante

python3 manage.py createsuperuser

et naviguer dans la section admin (example.com/admin/) et ajouter une action pour valider le bon fonctionnement de la base de données.

Migration d’une base sqlite3 vers postgresql

  1. Exporter les données de la base sqlite3

python3 manage.py dumpdata > site-export.json
  1. Changez les options dans votre ficher settings.py pour passer de l’utilisation du ficher db.sqlite3 vers la base postgres
    (cf process dans la section « Configuration de la base postgresql » )
  2. Supprimez le « ContentType » pour éviter des erreurs lors de la migration

python3 manage.py shell

Une fois dans python

from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
exit()
  1. Charger l’export dans votre base postgres

python3 manage.py loaddata site-export.json

⚠️ En cas d’erreur sur le champ id veuillez regarder dans la section « erreur connues » ci-dessous

Erreurs connues

Postgres

« @id is out of range »

Cette erreur se produit notamment lors d’une migration depuis une base déjà existante (ie db.sqlite3 > postgres ) qui contient des « @id » trop grand.

Dans ce cas vous devez changer le format des tables de INT vers BIGINT, voici le processus :

  1. Connectez vous à psql en tapant psql ou sudo -u postgres psql

  2. Connectez vous à votre base en tapant \c database_name. ex avec la config au dessus : \c risefor_database

  3. Changez le format de chaque colonnes, voici les commandes à taper successivement

alter table risefor_lobbying_missionParlementaire alter column id type bigint;
alter sequence "public.risefor_lobbying_missionParlementaire_id_seq"  as bigint;
alter table risefor_lobbying_groupeEtude alter column id type bigint;
alter sequence public.risefor_lobbying_groupeEtude_id_seq  as bigint;

alter table "risefor_lobbying_representative_parliamentaryMissions" alter column id type bigint;
alter table "risefor_lobbying_representative_parliamentaryMissions" alter column missionparlementaire_id type bigint;
alter table "risefor_lobbying_representative_parliamentaryMissions" alter column representative_id type bigint;
alter sequence public.risefor_lobbying_representative_parliamentary_missions_id_seq  as bigint;
alter table "risefor_lobbying_representative_studyGroups" alter column id type bigint;
alter sequence public.risefor_lobbying_representative_study_groups_id_seq  as bigint;

alter table "risefor_lobbying_representative_studyGroups" alter column id type bigint;
alter table "risefor_lobbying_representative_studyGroups" alter column representative_id type bigint;
alter table "risefor_lobbying_representative_studyGroups" alter column groupeetude_id type bigint;