From 850c0381aa56583416fb5152d25d2f72187ee80e Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Sun, 13 Mar 2022 19:24:19 +0100 Subject: [PATCH] Add the dependency graph within migrations --- ...tions_auth_admin_contenttypes_sessions.png | Bin 0 -> 63532 bytes source/part-3-data-model/migrations.adoc | 109 ++++++++++++------ 2 files changed, 76 insertions(+), 33 deletions(-) create mode 100644 source/images/db/migrations_auth_admin_contenttypes_sessions.png diff --git a/source/images/db/migrations_auth_admin_contenttypes_sessions.png b/source/images/db/migrations_auth_admin_contenttypes_sessions.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd2d598bf80cac8551aa88638afc12108c6a432 GIT binary patch literal 63532 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 JS?83{1ON+iFERiC literal 0 HcmV?d00001 diff --git a/source/part-3-data-model/migrations.adoc b/source/part-3-data-model/migrations.adoc index c77f4d0..8810baf 100644 --- a/source/part-3-data-model/migrations.adoc +++ b/source/part-3-data-model/migrations.adoc @@ -1,13 +1,14 @@ == Migrations -L'intégration des migrations a été réalisée dans la version 1.7 de Django. -Avant cela, il convenait de passer par une librairie tierce intitulée https://south.readthedocs.io/en/latest[South]. - Dans cette section, nous allons voir comment fonctionnent les migrations. Lors d'une première approche, elles peuvent sembler un peu magiques, puisqu'elles centralisent un ensemble de modifications pouvant être répétées sur un schéma de données, en tenant compte de ce qui a déjà été appliqué et en vérifiant quelles migrations devaient encore l'être pour mettre l'application à niveau. - Une analyse en profondeur montrera qu'elles ne sont pas plus complexes à suivre et à comprendre qu'un ensemble de fonctions de gestion appliquées à notre application. +NOTE: La commande `sqldump`, qui nous présentera le schéma tel qu'il sera compris. + +L'intégration des migrations a été réalisée dans la version 1.7 de Django. +Avant cela, il convenait de passer par une librairie tierce intitulée https://south.readthedocs.io/en/latest[South]. + Prenons l'exemple de notre liste de souhaits; nous nous rendons (bêtement) compte que nous avons oublié d'ajouter un champ de `description` à une liste. Historiquement, cette action nécessitait l'intervention d'un administrateur système ou d'une personne ayant accès au schéma de la base de données, à partir duquel ce-dit utilisateur pouvait jouer manuellement un script SQL. (((sql))) Cet enchaînement d'étapes nécessitait une bonne coordination d'équipe, mais également une bonne confiance dans les scripts à exécuter. @@ -190,6 +191,73 @@ Nous obtenons à présent la représentation suivante en base de données: image::images/db/link-book-category-m2m.drawio.png[] +=== Graph de dépendances + +Lorsqu'une migration applique une modification au schéma d'une base de données, il est évident qu'elle ne peut pas être appliquée dans n'importe quel ordre ou à n'importe quel moment. + +Dès la création d'un nouveau projet, avec une configuration par défaut et même sans avoir ajouté d'applications, Django proposera immédiatement d'appliquer les migrations des applications **admin**, **auth**, **contenttypes** et **sessions**, qui font partie du coeur du système, et qui se trouvent respectivement aux emplacements suivants: + +* *admin*: `site-packages/django/contrib/admin/migrations` +* *auth*: `site-packages/django/contrib/auth/migrations` +* *contenttypes*: `site-packages/django/contrib/contenttypes/migrations` +* *sessions*: `site-packages/django/contrib/sessions/migrations` + +Ceci est dû au fait que, toujours par défaut, ces applications sont reprises au niveau de la configuration d'un nouveau projet, dans le fichier `settings.py`: + +[source,python] +---- +[snip] + +INSTALLED_APPS = [ + 'django.contrib.admin', <1> + 'django.contrib.auth', <2> + 'django.contrib.contenttypes', <3> + 'django.contrib.sessions', <4> + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +[snip] +---- +<1> Admin +<2> Auth +<3> Contenttypes +<4> et Sessions. + +Dès que nous les appliquerons, nous recevrons les messages suivants: + +[source,bash] +---- +$ python manage.py migrate +Operations to perform: + Apply all migrations: admin, auth, contenttypes, library, sessions, world +Running migrations: + Applying contenttypes.0001_initial... OK + Applying auth.0001_initial... OK + Applying admin.0001_initial... OK + Applying admin.0002_logentry_remove_auto_add... OK + Applying admin.0003_logentry_add_action_flag_choices... OK + Applying contenttypes.0002_remove_content_type_name... OK + Applying auth.0002_alter_permission_name_max_length... OK + Applying auth.0003_alter_user_email_max_length... OK + Applying auth.0004_alter_user_username_opts... OK + Applying auth.0005_alter_user_last_login_null... OK + Applying auth.0006_require_contenttypes_0002... OK + Applying auth.0007_alter_validators_add_error_messages... OK + Applying auth.0008_alter_user_username_max_length... OK + Applying auth.0009_alter_user_last_name_max_length... OK + Applying auth.0010_alter_group_name_max_length... OK + Applying auth.0011_update_proxy_permissions... OK + Applying auth.0012_alter_user_first_name_max_length... OK + Applying sessions.0001_initial... OK +---- + +Cet ordre est défini au niveau de la propriété `dependencies`, que l'on retrouve au niveau de chaque description de migration, +En explorant les paquets qui se trouvent au niveau des répertoires et en analysant les dépendances décrites au niveau de chaque action de migration, on arrive au schéma suivant, qui est un graph dirigé acyclique: + +image::images/db/migrations_auth_admin_contenttypes_sessions.png[] + + === Sous le capot Une migration consiste à appliquer un ensemble de modifications (ou **opérations**), qui exercent un ensemble de transformations, pour que le schéma de base de données corresponde au modèle de l'application sous-jacente. @@ -210,6 +278,10 @@ Traceback (most recent call last): sqlite3.OperationalError: no such column: library_book.summary ---- +Pour éviter ce type d'erreurs, il est impératif que les nouvelles migrations soient appliquées **avant** que le code ne soit déployé; l'idéal étant que ces deux opérations soient réalisées de manière atomique, avec un _rollback_ si une anomalie était détectée. + +En allant + Pour éviter ce type d'erreurs, plusieurs stratégies peuvent être appliquées: intégrer ici un point sur les updates db - voir designing data-intensive applications. @@ -221,7 +293,6 @@ A noter que les migrations n'appliqueront de modifications que si le schéma est Ajouter une propriété `related_name` sur une ForeignKey n'engendrera aucune nouvelle action de migration, puisque ce type d'action ne s'applique que sur l'ORM, et pas directement sur la base de données: au niveau des tables, rien ne change. Seul le code et le modèle sont impactés. - Une migration est donc une classe Python, présentant _a minima_ deux propriétés: 1. `dependencies`, qui décrit les opérations précédentes devant obligatoirement avoir été appliquées @@ -252,8 +323,6 @@ class Migration(migrations.Migration): ] ---- -Nous avions un modèle reprenant quelques classes, elles-mêmes saupoudrées de quelques propriétés. - === Réinitialisation d'une ou plusieurs migrations @@ -261,29 +330,3 @@ https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migration > En gros, soit on supprime toutes les migrations (en conservant le fichier __init__.py), soit on réinitialise proprement les migrations avec un --fake-initial (sous réserve que toutes les personnes qui utilisent déjà le projet s'y conforment... Ce qui n'est pas gagné. Pour repartir de notre exemple ci-dessus, nous avions un modèle reprenant quelques classes, saupoudrées de propriétés décrivant nos différents champs. Pour être prise en compte par le moteur de base de données, chaque modification doit être - - -=== Description d'une migration - -1. Décrite, grâce à la commande `makemigrations` - -=== Application d'une ou plusieurs migrations - -1. Appliquée, avec la commande `migrate`. - -=== Analyse - -Nous allons ci-dessous analyser exactement les modifications appliquées au schéma de la base de données, en fonction des différents cas, et comment ils sont gérés par les pilotes de Django. -Nous utiliserons https://sqlitebrowser.org/[Sqlite Browser] et la commande `sqldump`, qui nous présentera le schéma tel qu'il sera compris. - -==== Création de nouveaux champs - - - -==== Modification d'un champ existant - - -==== Suppression d'un champ existant - - -