La création d'applications Web à l'aide du framework Django est très pratique. Si vous comparez le modèle MVC, il implémente des détails compliqués dans les parties Modèle et Vue, aidant le programmeur à se concentrer sur ce qu'il veut faire (Contrôle). Cette fois, je voudrais décrire les migrations liées à la partie Modèle. Reportez-vous au Tutoriel officiel Django pour les paramètres de création du projet Django, et [ici](https: // docs. djangoproject.com/en/1.11/topics/migrations/#historical-models) est référencé.
Traduit en japonais, migrations signifie «migration». Dans Django, cela fait principalement référence à la possibilité de changer automatiquement les structures de données conçues par l'utilisateur dans un schéma de base de données (vous pouvez écrire des fichiers de migration manuellement, mais je vous en montrerai plus si j'en ai l'occasion).
Créons une application en faisant référence à Tutorial (cependant, uniquement la partie du modèle de données).
Environnement de développement |
---|
Mac OS:Sierra |
python2.7.10 |
django1.11.2 |
mysql5.7.18 |
Entrez dans le répertoire de travail et entrez la commande suivante dans le terminal:
django-admin startproject m_Migration
python manage.py startapp polls
Vous avez maintenant créé une application de sondage dans le projet m_Migration et à l'intérieur. Ensuite, configurez la base de données. Il utilise mysql au lieu du sqlite par défaut, donc Vous devez modifier le fichier de paramètres de votre projet.
python:settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'blog',
'USER':'user',
'PASSWORD':'',
'HOST':'',
'PORT':'3306',
}
}
Après cela, reflétez les paramètres initiaux dans le terminal.
python manage.py migrate
Journal:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
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 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 sessions.0001_initial... OK
Lorsque j'entre dans le client mysql et que je regarde la table que j'ai actuellement dans le blog de la base de données:
+----------------------------+
| Tables_in_blog |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
Une base de données liée au framework a été créée. Actuellement, seule l'application polls a le module model.py, le package polls a donc créé le dossier migrations.
Créez une catégorie et un article de modèle de données à utiliser dans l'application de sondages.
models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=100)
text = models.CharField(max_length=1000)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
La fonction de l'application de sondages est d'afficher les articles de blog enregistrés. Par conséquent, nous avons créé un modèle d'article Article et un modèle Catégorie qui montre le genre de l'article. Afin de refléter le modèle créé, créez d'abord un fichier de migration décrivant l'opération.
python manage.py makemigrations polls
Journal:
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Article
- Create model Category
- Add field category to article
Ici, dans le dossier migrations /, j'ai créé un fichier de migrations 0001_initial.py qui enregistre les modifications apportées à model.py cette fois. Ensuite, reflétez le fichier de migrations créé
python manage.py migrate
Journal:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
Maintenant dans la base de données
+----------------------------+
| Tables_in_blog |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| polls_article |
| polls_category |
+----------------------------+
En regardant le schéma de la table:
mysql>DESC polls_article;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| text | varchar(1000) | NO | | NULL | |
| category_id | int(11) | NO | MUL | NULL | |
+-------------+---------------+------+-----+---------+----------------+
mysql>DESC polls_category;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
Une nouvelle table d'application de sondages (polls_article, polls_category) a été créée selon le modèle (le champ id est automatiquement créé par défaut). Jusqu'à présent, le flux de conception d'un modèle avec une application et de création d'une base de données à l'aide de la fonction de migration de django.
Nous pouvons le créer une fois, puis modifier le modèle de données, par exemple en ajoutant de nouvelles fonctionnalités.
Prenons par exemple l'application de sondages. Par exemple, le service de blog original a fourni des articles avec seulement des lettres, mais comme j'ai acheté un bon appareil photo numérique, le propriétaire veut ajouter des images aux articles. Ajoutons maintenant un champ image_url au modèle d'article pour stocker l'url de la photo (définissons également la valeur par défaut pour les enregistrements existants).
models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=100)
text = models.CharField(max_length=1000)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
image_url = models.URLField(max_length=200, default='toBeImplement')
Enregistrez vos modifications
python manage.py makemigrations polls
Journal:
Migrations for 'polls':
polls/migrations/0002_article_image_url.py
- Add field image_url to article
Un nouveau fichier de migrations 0002_article_image_url.py a été créé.
Reflétez les changements.
python manage.py migrate
Base de données Jetons un coup d'œil au schéma actuel:
DESC polls_article;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| text | varchar(1000) | NO | | NULL | |
| category_id | int(11) | NO | MUL | NULL | |
| image_url | varchar(200) | NO | | NULL | |
+-------------+---------------+------+-----+---------+----------------+
J'ai pu mettre à jour la base de données comme prévu.
Vous pouvez également contrôler la version du modèle de données, comme VCS tel que git. L'un des points forts de cette fonctionnalité est la récupération du modèle de données en cas d'urgence. Effectuez temporairement les modifications liées à l'url de la photo dans l'exemple ci-dessus et exécutez la commande migrate avec le fichier de migration 0002_article_image_url.py créé.
python manage.py migrate
Ici, la migration a échoué. Le dernier état des migrations est 0002_article_image_url.py, mais le schéma de base de données réel correspond à 0001_initial.py. Dans cet état, il n'y a pas de colonne correspondant à l'url de la photo dans le tableau. J'obtiens une erreur lorsque j'essaye d'accéder aux données d'URL de la photo à partir de l'application de sondages. Une solution de contournement pour ce problème consiste à restaurer l'état des migrations sur 0001_initial.py (puis à rechercher le sac).
Pour récupérer, utilisez également la commande migrate pour restaurer l'état enregistré dans le fichier de migration 0001_initial.py.
python manage.py migrate polls 0001_initial
Journal:
Operations to perform:
Target specific migration: 0001_initial, from polls
Running migrations:
Rendering model states... DONE
Unapplying polls.0002_article_image_url... OK
Comme le montre le journal, les modifications apportées à 0002_article_image_url.py n'ont pas été appliquées. Jetons un coup d'œil au schéma actuel de la table Article:
DESC polls_article;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| text | varchar(1000) | NO | | NULL | |
| category_id | int(11) | NO | MUL | NULL | |
+-------------+---------------+------+-----+---------+----------------+
La table est revenue à son état d'origine.
Recommended Posts