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.
Ü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).
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.
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.
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.
Wir können es einmal erstellen und dann das Datenmodell ändern, z. B. neue Funktionen hinzufügen.
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.
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