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
Ü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.
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!
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,
`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.
alembic revision --autogenerate
Wenn nach dem Ausgeben eines neuen Migrationsskripts dies nicht der Fall ist, können Sie das generierte Skript anscheinend einfach löschen. Lose.
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.
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.
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