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 :
Dev: Permet de créer et utiliser une base de données sqlite3
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:
Naviguez dans le dossier
/united4earthAssurez vous que les fichiers « appartiennent » au user publique
chown -R www-data:www-data .
Rédemarrez le serveur
Rafraichissez la page, normalement l’erreur aura disparue
Utilisation de Postgresql
1. Installation de postgres et création de la base
Installer les packages nécessaires
sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
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
Exporter les données de la base sqlite3
python3 manage.py dumpdata > site-export.json
- Changez les options dans votre ficher
settings.pypour passer de l’utilisation du ficher db.sqlite3 vers la base postgres(cf process dans la section « Configuration de la base postgresql » ) 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()
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 :
Connectez vous à psql en tapant
psql ou sudo -u postgres psqlConnectez vous à votre base en tapant
\c database_name. ex avec la config au dessus :\c risefor_databaseChangez 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;