.. 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;