[PYTHON] In der Mitte der Entwicklung werden wir Alembic vorstellen

Ich möchte die Version des DB-Schemas verwalten

Ich dachte, ich würde es richtig machen, also fügte ich Alembic hinzu.

DB Schema Versionsverwaltung ~? http://www.slideshare.net/kwatch/db-28097225

Dies ist die beste Referenz für die Installation und die grundlegende Verwendung, daher denke ich, dass dies in Ordnung ist http://momijiame.tumblr.com/post/45191790683/python-alembic-rdb

Auch während der Entwicklung einfach einzuführen

Übrigens, in meinem Fall gibt es dieses Mal, da ich bereits mit der Erstellung einer Anwendung begonnen habe, bereits einige Modelldefinitionen von SQLAlchemy, und natürlich gibt es bereits eine Tabelle in der Datenbank. Dies ist eine weitere Tabelle im Migrationsskript von Alembic Muss ich alle Definitionen von op.create_table schreiben? Ernsthaft? Es ist schwer ... Es ist so schwer wie ein Krieg ... Aber es ist schwerer als ein Krieg ...

Ich dachte, aber es gibt eine Funktion, um die Definitionen von DB und SQLAlchemy richtig zu lesen und automatisch ein Migrationsskript zu generieren.

http://alembic.readthedocs.org/en/latest/tutorial.html#auto-generating-migrations

Ein Kind, das kann. Dieses Kind kann seine Brieftasche verlassen. Also werde ich diese Straße ausprobieren.

Automatische Generierung des Migrationsskripts

Es wird davon ausgegangen, dass die anfängliche Einstellung von Alembic unter Bezugnahme auf den ersten Standort abgeschlossen ist. Wenn jedoch nach dem Ausführen von "alembic init" "sqlalchemy.url" in der erstellten alembic.ini richtig eingestellt ist, wird es mit der Datenbank verbunden, sodass es möglicherweise in Ordnung ist.

Also das Hauptthema. Ich werde Ihnen den Speicherort der Basis Ihrer Anwendung als Quelle für die automatische Generierung mitteilen.

env.py


import webapp.model.database
target_metadata = Base.metadata

Es scheint, dass dies alles ist, was Sie brauchen. Lassen Sie uns das erste Migrationsskript erstellen. Wenn Sie --autogenerate hinzufügen, wird automatisch etwas ausgeführt. tolle. Es ist automatisch ~ Ich mag es! Eine automatische Mochitsuki-Maschine!

Löschen Sie zuvor hier alle Tabellen in der Datenbank einmal.

Die automatische Generierung scheint den Unterschied zwischen DB- und SQL Alchemy-Metadaten zu erkennen. Das erste Skript, das von nun an automatisch generiert wird, ist ein Skript zur Tabellengenerierung, daher sollte die Datenbank leer sein. Ist es nicht? Es ist mir egal.

Also habe ich einmal alle DB-Tabellen gelöscht. Geben Sie danach sofort den Befehl ein.

$ alembic revision --autogenerate -m "Create table"

Ich konnte etwas unter alebmic / version / machen! Die Spannung steigt! Wenn Sie dies nicht können, liegt dies wahrscheinlich daran, dass Base nicht korrekt importiert wurde.

# revision identifiers, used by Alembic.
revision = '30552bc9b83'
down_revision = None

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.drop_table('order_logs')
    op.drop_table('order_items')
    op.drop_table('users')
    ### end Alembic commands ###


def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.create_table('users',
    sa.Column('id', sa.INTEGER(), primary_key=True),
    sa.Column('name', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('mail_address', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('password', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('status', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('insert_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('update_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('id', name='users_pkey')
    )
    op.create_table('order_items',
    sa.Column('id', sa.INTEGER(), primary_key=True),
    sa.Column('order_log_id', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('user_id', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('item_name', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('item_price', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('item_number', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('item_total', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('status', sa.SMALLINT(), autoincrement=False, nullable=True),
    sa.Column('insert_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('update_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('id', name='order_items_pkey')
    )
    op.create_table('order_logs',
    sa.Column('id', sa.INTEGER(), primary_key=True),
    sa.Column('user_id', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('order_no', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('order_name', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('order_name_kana', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('order_zip', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('order_address', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('order_mail_address', sa.TEXT(), autoincrement=False, nullable=True),
    sa.Column('order_phone_number', sa.TEXT(), autoincrement=False, nullable=True),
     sa.Column('total', sa.INTEGER(), autoincrement=False, nullable=True),
    sa.Column('status', sa.SMALLINT(), autoincrement=False, nullable=True),
    sa.Column('insert_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.Column('update_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True),
    sa.PrimaryKeyConstraint('id', name='order_logs_pkey')
    )

Wie schön! Versuchen Sie nun, `upgrade ()` des von Ihnen erstellten Migrationsskripts auszuführen.

$ alembic upgrade head

In der DB wurde eine Tabelle erstellt!

Versuchen Sie ein Downgrade.

$ alembic downgrade -1

Der Tisch ist aus der DB verschwunden! (Weil es vor einmal leer war)

$ alembic upgrade +1

Es ist wieder soweit! Zu gehorsam! Sie können ungefähr einmal dagegen vorgehen!

Danach können Sie sich genauso fühlen

Wenn ich danach die Definition der Tabelle ändere, erstelle ich ein Migrationsskript mit Alembic und spiele mit der Datenbank darüber.

Wenn Sie nach dem Umschreiben der Tabellendefinition auf der SQLAlchemy-Seite eine weitere `` `Alembic-Revision --autogenerate``` durchführen, wird automatisch ein Migrationsskript für die Differenz im Vergleich zum Status der Datenbank erstellt. Uhyo ~! !!

Also gut, die Dinge, die ich mache, sind fast die gleichen,

  1. Spielen Sie mit der SQLAclhemy-Tabellendefinition
  2. Wenn Sie zu DB reflektieren, wird anstelle von SQLAlchemys `drop ()` create () Alembics` `alembic revision --autogenerate -m" hoge "` ` Folgen Sie einfach den Schritten `und`` Alembic Upgrade + 1```.

Ich dachte, es wäre gut, wenn ich es reparieren könnte, als ich sagte, es sei schlecht.

Andere Dinge, die mir aufgefallen sind

Es ist in Ordnung, die Tabellendefinition versehentlich auszugeben

alembic revision --autogenerateWenn nach dem Ausgeben eines neuen Migrationsskripts dies nicht der Fall ist, können Sie das generierte Skript anscheinend einfach löschen. Lose.

Es ist in Ordnung, weil es locker ist, auch wenn Sie es falsch ausgeben und anwenden

Wenn Sie nach dem Anwenden auf die Datenbank einen Fehler im Migrationsskript finden, verwenden Sie `Alembic Downgrade -1```, um die DB auf den vorherigen Status zurückzusetzen, das Skript zu korrigieren und` Alembic Upgrade + 1``` Deyosage. Lose.

Die automatische Generierung ist begrenzt

Alembic erkannte den Unterschied zu den Standardwerten und externen Schlüsseln nicht. Das ist etwas enttäuschend, weil ich das Skript von Hand schreiben muss. Apropos http://alembic.readthedocs.org/en/latest/tutorial.html#auto-generating-migrations Gegen Ende gibt es eine Liste von Dingen, die als Unterschiede gefunden werden können, Dinge, die Sie nicht finden können, und Dinge, die Sie nicht finden können. Nun, diese Art von Gefühl.

Ich habe das Gefühl, dass die Funktion nicht gut konvertiert ist

In der Modelldefinition ist der Standardwert beispielsweise die aktuelle Zeit.

insert_date = Column(DateTime, server_default=func.now())

Als ich es tat, war das Skript, das ich machen wollte, so.

sa.Column('insert_date', sa.DateTime(), server_default=func.now(), nullable=True),

Dies ist schlecht, und wenn Sie dies versehentlich tun, wird func.now () im laufenden Betrieb ausgewertet und der Standardwert wird auf das Datum festgelegt, an dem Sie ihn ausgeführt haben, z. B. 2014/1/1 00: 00: 00 Werden.

Jetzt manuell Skript

sa.Column('insert_date', sa.DateTime(), server_default=sa.func.now(), nullable=True),

Ich führe es aus, nachdem ich es umgeschrieben habe, aber ich bin nicht gut darin ... Kann mir bitte jemand sagen ...

Das Ende

Recommended Posts

In der Mitte der Entwicklung werden wir Alembic vorstellen
Wartung der Django + MongoDB-Entwicklungsumgebung (mitten im Schreiben)
#Wir automatisieren die Datenaggregation von Wiire! Teil 1
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
django kann nicht in der Entwicklungsumgebung von pipenv + pyenv installiert werden
Die Geschichte der Teilnahme an AtCoder
Unterdrücken Sie Seitenumbrüche in der Mitte einer Tabelle mit Sphinx Single HTML
Die Geschichte des "Lochs" in der Akte
Verwenden von TensorFlow in Cloud 9 Integrierte Entwicklungsumgebung - Grundlagen der Verwendung
Richtlinien für die Reinkarnation in der Welt der Linux-Programmierentwicklung (C / C ++ - Sprache)
Seit der Veröffentlichung von DataLiner 1.2.0 werden wir die neu hinzugefügte Vorverarbeitung einführen.
Mit dem Aufkommen von systemd-homed im Jahr 2020 wird sich die Linux-Benutzerverwaltung dramatisch ändern.
[Verständnis in 3 Minuten] Der Beginn von Linux
Überprüfen Sie das Verhalten des Zerstörers in Python
Algorithmus Gymnastik 24 Mitte der verknüpften Liste
Das Ergebnis der Installation von Python auf Anaconda
Grundlagen zum Ausführen von NoxPlayer in Python
Ermitteln Sie den Wert der mittleren Schicht von NN
Auf der Suche nach dem schnellsten FizzBuzz in Python
Sie werden in 100 Tagen Ingenieur - 29. Tag - Python - Grundlagen der Python-Sprache 5
Sie werden in 100 Tagen Ingenieur - Tag 33 - Python - Grundlagen der Python-Sprache 8
Sie werden in 100 Tagen Ingenieur - 26. Tag - Python - Grundlagen der Python-Sprache 3
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
Sie werden in 100 Tagen Ingenieur - Tag 32 - Python - Grundlagen der Python-Sprache 7
Nachdem ich das Paketsystem kenne, werde ich Hello World vorstellen
Sie werden in 100 Tagen Ingenieur - 28. Tag - Python - Grundlagen der Python-Sprache 4
Geben Sie die Anzahl der CPU-Kerne in Python aus
Bedeutung von {Versionsnummer} im MySQL-RPM-Paket
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Ändern Sie die Schriftgröße der Legende in df.plot
Passen Sie die Verteilung jeder Gruppe in Python an
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Instanziierung der zuvor erstellten BOX-Entwicklungsumgebung
Kopieren Sie die Liste in Python
Finden Sie die Anzahl der Tage in einem Monat
Lesen Sie die Ausgabe von subprocess.Popen in Echtzeit
Finden Sie den Bruchteil des in Python eingegebenen Werts heraus
Die Geschichte, das optimale n in N Faust zu finden
Korrigieren Sie die Argumente der in map verwendeten Funktion
Über die Entwicklungsinhalte des maschinellen Lernens (Beispiel)
Finden Sie die Lösung der Gleichung n-ter Ordnung mit Python
Die Geschichte des Lesens von HSPICE-Daten in Python
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Lösen von Bewegungsgleichungen in Python (odeint)
Visualisierte den Nutzungsstatus der Spüle im Unternehmen
Ausgabe in Form eines Python-Arrays
Die Geschichte der Anzeige von Mediendateien in Django
Suchen Sie nach dem Wert der Instanz in der Liste
Machen Sie den Fortschritt von dd in der Fortschrittsanzeige sichtbar