[PYTHON] Notes d'apprentissage pour la fonction migrations dans le framework Django (1)

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

Que sont les migrations

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

Utilisons-le d'abord

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.

Paramètres de la base de données Django

  1. Lancez mysql et créez le mot de passe utilisateur et utilisateur ainsi que la base de données à utiliser cette fois.
  2. Modifiez settings.py dans le package de projet en fonction de l'attribut créé en 1. (Pour plus de détails, cliquez ici](https://docs.djangoproject.com/en/1.11/ref/settings/#core- Voir les paramètres).
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éons un modèle

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.

Cas d'utilisation courants

Nous pouvons le créer une fois, puis modifier le modèle de données, par exemple en ajoutant de nouvelles fonctionnalités.

Mise à jour du modèle de données

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.

Récupération du modèle de données

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

Notes d'apprentissage pour la fonction migrations dans le framework Django (2)
Notes d'apprentissage pour la fonction migrations dans le framework Django (3)
Notes d'apprentissage pour la fonction migrations dans le framework Django (1)
Notes diverses sur le framework Django REST
List, méthode pour les ressources imbriquées dans le framework Django REST
Comment écrire une validation personnalisée dans Django REST Framework
Résumé des points d'achoppement à Django pour la première fois
Notes de lancement pour les applications Django existantes
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 5 ~
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 4 ~
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 1, 2, 3 ~
Changer la langue affichée dans Django 1.9
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 6 ~
Historique d'apprentissage pour participer au développement d'applications d'équipe en Python ~ Tutoriel Django 7 ~
Démarrez Django pour la première fois
Résumé des pages utiles pour étudier le framework d'apprentissage profond Chainer
Récupérer la chaîne de requête (chaîne de requête) avec Django
Obtenez l'adresse IP du client avec Django
Présentation du framework BOT Minette pour Python
Suppression logique dans Django, DRF (Django REST Framework)
Comprendre la commodité de Django Rest Framework
Django ~ Affichons-le sur le navigateur ~
Note de nfc.ContactlessFrontend () de nfcpy de python
Notes d'apprentissage depuis le début de Python 1
Remarques sur la création de fichiers statiques avec Django
Changer la liste dans l'instruction for
Paramètre d'attribut de même site du cookie dans Django
Obtenir les paramètres de requête pour les requêtes GET avec Django
MongoDB avec Python pour la première fois
Remarques sur l'utilisation de python (pydev) avec eclipse
Notes d'apprentissage depuis le début de Python 2
Essayez d'accéder à l'API Spotify dans Django.
[Renforcer l'apprentissage] Rechercher le meilleur itinéraire
Tout refaire pour l'écran de connexion Django
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
Ingénierie des fonctionnalités pour l'apprentissage automatique à partir du 4e Google Colaboratory - Fonctionnalités interactives
Mémo Django
Comment installer le framework d'apprentissage en profondeur Tensorflow 1.0 dans l'environnement Windows Anaconda
La fonction _authenticate_with_backend était obsolète dans django auth.autenticate
CERTIFICATE_VERIFY_FAILED dans Python 3.6, le programme d'installation officiel de macOS
L'histoire selon laquelle le coût d'apprentissage de Python est faible
Conseils pour accéder à l'API ATND avec Python
Notes pour la mise en œuvre d'un co-filtrage simple en Python
Spécifiez l'URL de la vue dans le modèle Django
L'histoire de l'affichage des fichiers multimédias dans Django
Implémenter la fonctionnalité de connexion JWT dans le framework Django REST
[Implémentation pour l'apprentissage] Implémentation de l'échantillonnage stratifié en Python (1)
[Django] css dans le projet ne peut pas être lu
Faites une recherche ambiguë pour mysql dans Django
Notes de connaissances nécessaires pour comprendre le framework Python
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser
[Pour les débutants] Introduction à la vectorisation dans l'apprentissage automatique
J'ai installé le framework Deep Learning Chainer
Reproduisons l'outil d'enseignement arithmétique "Jamaica" ❗️ vol.02 "Notes pour créer des fonctions en Python"
Reproduisons l'outil d'enseignement de l'arithmétique "Jamaica" ❗️ vol.01 "Notes pour l'affichage des images en Python"