[PYTHON] Lernnotizen für die Migrationsfunktion im Django-Framework (1)

Das Erstellen von Webanwendungen mit dem Django-Framework ist sehr praktisch. Wenn Sie das MVC-Modell vergleichen, werden komplizierte Details in den Teilen Modell und Ansicht implementiert, sodass sich der Programmierer auf das konzentrieren kann, was er tun möchte (Steuerung). Dieses Mal möchte ich Migrationen im Zusammenhang mit dem Modellteil beschreiben. Informationen zum Erstellen von Django-Projekten und [hier](https: // docs) finden Sie in Django Official Tutorial. Auf djangoproject.com/de/1.11/topics/migrations/#historical-models) wird verwiesen.

Was sind Migrationen?

Übersetzt ins Japanische bedeutet Migration "Migration". In Django bezieht es sich hauptsächlich auf die Möglichkeit, benutzerdefinierte Datenstrukturen automatisch in ein Datenbankschema zu ändern (Sie können Migrationsdateien manuell schreiben, aber ich werde Ihnen mehr zeigen, wenn ich die Möglichkeit dazu bekomme).

Lass es uns zuerst benutzen

Erstellen wir eine App unter Bezugnahme auf Tutorial (jedoch nur auf den Datenmodellteil).

Entwicklungsumgebung
Mac OS:Sierra
python2.7.10
django1.11.2
mysql5.7.18

Geben Sie das Arbeitsverzeichnis ein und geben Sie den folgenden Befehl in das Terminal ein:

django-admin startproject m_Migration
python manage.py startapp polls

Sie haben jetzt eine Umfrage-App im Projekt m_Migration und im Inneren erstellt. Richten Sie als Nächstes die Datenbank ein. Es wird also MySQL anstelle des Standard-SQLites verwendet Sie müssen die Einstellungsdatei für Ihr Projekt ändern.

Django-Datenbankeinstellungen

  1. Starten Sie MySQL und erstellen Sie den Benutzer und das Benutzerkennwort sowie die Datenbank, die dieses Mal verwendet werden sollen.
  2. Ändern Sie settings.py im Projektpaket gemäß dem in 1. erstellten Attribut. (Weitere Informationen finden Sie hier](https://docs.djangoproject.com/de/1.11/ref/settings/#core- Siehe Einstellungen).
python:settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'blog',
        'USER':'user',
        'PASSWORD':'',
        'HOST':'',
        'PORT':'3306',
    }
}

Spiegeln Sie danach die anfänglichen Einstellungen im Terminal wider.

python manage.py migrate

Log:

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

Wenn ich den MySQL-Client betrete und mir die Tabelle ansehe, die ich derzeit im Datenbank-Blog habe:

+----------------------------+
| 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             |
+----------------------------+

Eine Framework-bezogene Datenbank wurde erstellt. Derzeit verfügt nur die Umfrage-App über das Modul model.py, sodass das Umfragepaket den Migrationsordner erstellt hat.

Lassen Sie uns ein Modell erstellen

Erstellen Sie eine Datenmodellkategorie und einen Artikel zur Verwendung in der Umfrage-App.

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)

Die Funktion der Umfrage-App besteht darin, gespeicherte Blog-Beiträge anzuzeigen. Aus diesem Grund haben wir ein Artikelmodell Artikel und ein Kategoriemodell erstellt, das das Genre des Artikels zeigt. Um das erstellte Modell wiederzugeben, erstellen Sie zunächst eine Migrationsdatei, die den Vorgang beschreibt.

python manage.py makemigrations polls

Log:

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Article
    - Create model Category
    - Add field category to article

Hier im Ordner migrations / habe ich eine Migrationsdatei 0001_initial.py erstellt, in der die Änderungen an model.py dieses Mal aufgezeichnet werden. Zeigen Sie als Nächstes die erstellte Migrationsdatei an

python manage.py migrate

Log:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK

Jetzt in der Datenbank

+----------------------------+
| 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             |
+----------------------------+

Betrachten Sie das Tabellenschema:

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    |                |
+-------+--------------+------+-----+---------+----------------+

Eine neue Umfrage-App-Tabelle (polls_article, polls_category) wurde entsprechend dem Modell erstellt (das ID-Feld wird standardmäßig automatisch erstellt). Bisher der Ablauf des Entwurfs eines Modells mit einer App und der Erstellung einer Datenbank mithilfe der Migrationsfunktion von Django.

Häufige Anwendungsfälle

Wir können es einmal erstellen und dann das Datenmodell ändern, z. B. neue Funktionen hinzufügen.

Aktualisierung des Datenmodells

Nehmen Sie die Umfrage-App als Beispiel. Zum Beispiel hat der ursprüngliche Blog-Service Artikel nur mit Buchstaben versehen, aber da ich eine gute Digitalkamera gekauft habe, möchte der Eigentümer dem Artikel ein Foto hinzufügen. Fügen wir nun dem Artikelmodell ein Feld image_url hinzu, um die URL des Fotos zu speichern (legen Sie auch den Standardwert für vorhandene Datensätze fest).

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

Notieren Sie Ihre Änderungen

python manage.py makemigrations polls

Log:

Migrations for 'polls':
  polls/migrations/0002_article_image_url.py
    - Add field image_url to article

Eine neue Migrationsdatei 0002_article_image_url.py wurde erstellt.

Reflektieren Sie die Änderungen.

 python manage.py migrate

Datenbank Schauen wir uns das aktuelle Schema an:

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    |                |
+-------------+---------------+------+-----+---------+----------------+

Ich konnte die Datenbank wie geplant aktualisieren.

Datenmodellwiederherstellung

Sie können auch die Version des Datenmodells steuern, z. B. VCS wie git. Eine der nützlichsten Situationen für diese Funktion ist die Wiederherstellung des Datenmodells im Notfall. Ich habe die Änderungen in Bezug auf die Foto-URL im obigen Beispiel vorgenommen und den Befehl migrate mit der erstellten Migrationsdatei 0002_article_image_url.py ausgeführt.

 python manage.py migrate

Hier ist die Migration fehlgeschlagen. Der letzte Migrationsstatus lautet 0002_article_image_url.py, das tatsächliche Datenbankschema entspricht jedoch 0001_initial.py. In diesem Zustand gibt es keine Spalte, die der Foto-URL in der Tabelle entspricht. Ich erhalte eine Fehlermeldung, wenn ich versuche, über die Umfrage-App auf die Foto-URL-Daten zuzugreifen. Eine Problemumgehung für dieses Problem besteht darin, den Migrationsstatus in 0001_initial.py wiederherzustellen (und dann nach der Tasche zu suchen).

Verwenden Sie zum Wiederherstellen auch den Befehl migrate, um den in der Migrationsdatei 0001_initial.py aufgezeichneten Status wiederherzustellen.

python manage.py migrate polls 0001_initial

Log:

Operations to perform:
  Target specific migration: 0001_initial, from polls
Running migrations:
  Rendering model states... DONE
  Unapplying polls.0002_article_image_url... OK

Wie das Protokoll zeigt, wurden die Änderungen in 0002_article_image_url.py nicht übernommen. Werfen wir einen Blick auf das aktuelle Artikeltabellenschema:

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    |                |
+-------------+---------------+------+-----+---------+----------------+

Die Tabelle ist in ihren ursprünglichen Zustand zurückgekehrt.

Recommended Posts

Lernnotizen für die Migrationsfunktion im Django-Framework (2)
Lernnotizen für die Migrationsfunktion im Django-Framework (3)
Lernnotizen für die Migrationsfunktion im Django-Framework (1)
Verschiedene Hinweise zum Django REST-Framework
Listenmethode für verschachtelte Ressourcen im Django REST-Framework
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Zusammenfassung der Stolperpunkte in Django zum ersten Mal
Starten Sie Notizen für vorhandene Django-Anwendungen
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 5 ~
Lernverlauf für die Teilnahme an der Entwicklung von Team-Apps mit Python ~ Django Tutorial 4 ~
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 1, 2, 3 ~
Wechseln Sie die in Django 1.9 angezeigte Sprache
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 6 ~
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 7 ~
Starten Sie Django zum ersten Mal
Zusammenfassung der Seiten, die zum Studium des Deep Learning Framework Chainer nützlich sind
Holen Sie sich die Abfragezeichenfolge (Abfragezeichenfolge) mit Django
Holen Sie sich die IP-Adresse des Kunden mit Django
Einführung in das BOT-Framework Minette für Python
Logisches Löschen in Django, DRF (Django REST Framework)
Verstehen Sie den Komfort des Django Rest Framework
Django ~ Lass es uns im Browser anzeigen ~
Anmerkung von nfc.ContactlessFrontend () von nfcpy von Python
Notizen vom Anfang von Python 1 lernen
Hinweise zum Erstellen statischer Dateien mit Django
Ändern Sie die Liste in der for-Anweisung
Same-Site-Attributeinstellung des Cookies in Django
Abfrageparameter für GET-Anforderungen mit Django abrufen
MongoDB mit Python zum ersten Mal
Hinweise zur Verwendung von Python (Pydev) mit Eclipse
Notizen vom Anfang von Python 2 lernen
Versuchen Sie, die Spotify-API in Django zu aktivieren.
[Lernen stärken] Suche nach der besten Route
Wiederholen Sie alles für den Django-Anmeldebildschirm
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Feature Engineering für maschinelles Lernen Beginnend mit dem 4. Google Colaboratory - Interacting Features
Django Memo
So installieren Sie das Deep Learning Framework Tensorflow 1.0 in der Windows Anaconda-Umgebung
Die Funktion _authenticate_with_backend wurde in django auth.autenticate nicht mehr unterstützt
CERTIFICATE_VERIFY_FAILED in Python 3.6, dem offiziellen Installationsprogramm für macOS
Die Geschichte, dass die Lernkosten von Python niedrig sind
Tipps zum Erreichen der ATND-API mit Python
Hinweise zur Implementierung einer einfachen Co-Filterung in Python
Geben Sie die Ansichts-URL in der Django-Vorlage an
Die Geschichte der Anzeige von Mediendateien in Django
Implementieren Sie die JWT-Anmeldefunktion im Django REST-Framework
[Implementierung zum Lernen] Implementieren Sie Stratified Sampling in Python (1)
[Django] CSS im Projekt kann nicht gelesen werden
Führen Sie eine mehrdeutige Suche nach MySQL in Django durch
Wissensnotizen erforderlich, um das Python-Framework zu verstehen
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
[Für Anfänger] Einführung in die Vektorisierung beim maschinellen Lernen
Ich habe den Deep Learning Framework Chainer installiert
Lassen Sie uns das arithmetische Lehrmittel "Jamaica" ❗️ Vol.02 "Hinweise zum Erstellen von Funktionen in Python" reproduzieren.
Lassen Sie uns das arithmetische Lehrmittel "Jamaica" ❗️ Vol.01 "Hinweise zum Anzeigen von Bildern in Python" reproduzieren.