.. 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
**********************
.. contents:: Table des matières
:local:
:depth: 2
.. warning::
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:
.. code-block:: bash
. 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
.. code-block:: python
...
dataBaseType = 'dev or postgresql'
if dataBaseType == 'dev':
...
.. admonition:: 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
-------------------------
.. warning::
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"
.. code-block:: python
...
dataBaseType = 'dev'
if dataBaseType == 'dev':
...
2. Création de la base de données
-------------------------
Positionnez vous dans le dossier ``united4earth/`` et tapez :
.. code-block:: bash
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
.. code-block:: bash
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
.. code-block:: bash
chown -R www-data:www-data .
3. Rédemarrez le serveur
4. Rafraichissez la page, normalement l'erreur aura disparue
Utilisation de Postgresql
==============
1. Installation de postgres et création de la base
---------------
a. Installer les packages nécessaires
.. code-block:: bash
sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib
b. Création de l'utilisateur et de la base de données
Connectez vous à postgres
.. code-block:: bash
sudo -u postgres psql
puis tapez les commandes suivantes :
.. code-block:: postgres
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:
.. code-block:: python
...
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 :
.. code-block:: python
'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 :
.. code-block:: python
'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 ! |:tada:|
Positionnez vous dans le dossier ``united4earth/`` et tapez :
.. code-block:: bash
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
.. code-block:: bash
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
.. code-block:: bash
python3 manage.py dumpdata > site-export.json
2. | 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" )
3. Supprimez le "ContentType" pour éviter des erreurs lors de la migration
.. code-block:: shell
python3 manage.py shell
Une fois dans python
.. code-block:: python
from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
exit()
4. Charger l'export dans votre base postgres
.. code-block:: bash
python3 manage.py loaddata site-export.json
|:warning:| 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
.. code-block:: SQL
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;