Alembic ist ein Migrationswerkzeug für sqlalchemy, ein Python-Orm. Es gibt nicht viele Artikel auf Japanisch, und ich habe oft nicht bemerkt, dass ich es verwendet habe, also werde ich den Punkt notieren.
Alembic:http://alembic.zzzcomputing.com/en/latest/
Wenn mehrere Modelldateien vorhanden sind, müssen die Metadaten der Basisklasse kombiniert werden. http://liuhongjiang.github.io/hexotech/2015/10/14/alembic-support-multiple-model-files/ Die in diesem Blog beschriebene Methode funktioniert. In meinem Fall habe ich versucht, den dynamischen Import zu verwenden.
env.py
import importlib
from sqlalchemy.schema import MetaData
target_models =[
'path.to.models',
'another.models'
]
def import_model_bases():
"""import all target models base metadatas."""
lst = list(map(
lambda x: importlib.import_module(x).Base.metadata,
target_models
))
return lst
def combine_metadata(lst):
m = MetaData()
for metadata in lst:
for t in metadata.tables.values():
t.tometadata(m)
return m
target_metadata = combine_metadata(import_model_bases())
Wenn Sie denselben Spaltennamen beibehalten, wird die Typänderung nicht erkannt. Es scheint, dass es standardmäßig so eingestellt ist. http://stackoverflow.com/questions/17174636/can-alembic-autogenerate-column-alterations Dies wird ebenfalls wie in diesem Artikel geändert.
env.py
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix='sqlalchemy.',
poolclass=pool.NullPool)
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
compare_type=True #hinzufügen
)
with context.begin_transaction():
context.run_migrations()
Jetzt, da Sie die Typänderung kennen, haben Sie Probleme mit dem Booleschen Typ. Boolean wird von tinyint in mysql festgelegt, aber beim Vergleich wird festgestellt, dass der Typ unterschiedlich ist, und es wird jedes Mal versucht, Spalten zu löschen und zu erstellen. Auch wenn ich den Typ von tinyint in integer ändere, kann er nicht gut erkannt werden.
Wenn Sie es mit dem Gefühl beheben, dass es mit Bezug auf hier geschrieben ist, wird es funktionieren. Ich habe es wie folgt versucht.
env.py
#hinzufügen
from sqlalchemy import engine_from_config, types
from sqlalchemy.dialects import mysql
def my_compare_type(context, inspected_column,
metadata_column, inspected_type, metadata_type):
"""my compser type for mysql."""
if isinstance(inspected_type, mysql.TINYINT) and\
isinstance(metadata_type, types.Boolean):
return False
if isinstance(inspected_type, mysql.TINYINT) and\
isinstance(metadata_type, types.Integer):
return True
return None
def run_migrations_online():
"""Run migrations in 'online' mode.
In this scenario we need to create an Engine
and associate a connection with the context.
"""
connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix='sqlalchemy.',
poolclass=pool.NullPool)
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
compare_type=my_compare_type #Veränderung
)
with context.begin_transaction():
context.run_migrations()
Da Alembic viele Funktionen und viele Funktionen hat, die ich noch nicht verwendet habe, werde ich später hinzufügen, wovon ich süchtig war.
Recommended Posts