[PYTHON] Hinweise zur Verwendung von Alembic

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/

Ich möchte mehrere Modelldateien verarbeiten

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

Erkennt keine Typänderung

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

Beurteilen Sie Boolean und Tinyint als verschiedene Typen

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

Hinweise zur Verwendung von Alembic
[Django] Hinweise zur Verwendung der Django-Debug-Symbolleiste
Hinweise zur Verwendung von MeCab aus Python
Hinweise zur Verwendung von Post-Receive und Post-Merge
Hinweise zur Installation von Python mit PyEnv
Hinweise zur Verwendung von rstrip mit Python.
Hinweise zur Verwendung von matplotlib auf dem Server
(Anfänger) Hinweise zur Verwendung von pyenv auf dem Mac
Hinweise zur Flasche
Hinweise zur Verwendung von OpenCV mit Windows 10 Python 3.8.3.
Hinweise zur Implementierung von APNs-Tests mit Pytest
Hinweise zu neuronalen Netzen
Sellerie-Notizen zu Django
Hinweise zur Verwendung von dict mit Python [Competition Pro]
Hinweise zur Installation von PycURL
Hinweise zur Verwendung von TensorFlow unter Bash unter Ubuntu unter Windows
Hinweise zu Funktionen der SciPy.linalg-Familie
[Python] Hinweise zur Beschleunigung genetischer Algorithmen mithilfe von Multiprocessing
Mindestnotizen bei Verwendung von Python auf Mac (Homebrew Edition)
Hinweise zur Funktion und Rückverfolgung
Hinweise zur Installation von dlib auf einem Mac
Hinweise zum SQLite3-Modul von Python
Anmerkungen zu * args und ** kargs
Hinweise zum Definieren von PySide-Steckplätzen (2)
Versuchen Sie es mit OpenCV unter Windows
Anmerkungen zu Pyenv und Atom
Vorsichtsmaßnahmen beim Definieren von Slots für PySide
[Python] Hinweise zur Datenanalyse
Hinweise zur Installation von Python auf Ihrem Mac
Prozess auf GPU mit chainer.cuda.elementwise
Hinweise zur Installation von pipenv auf Ihrem Mac
Online-Übertragung mit Python
Hinweise zur Installation von Anaconda 3 unter Windows
Hinweise zu imshow () von OpenCV
Hinweise zur Installation von Python unter CentOS
Hinweise zu Python- und Wörterbuchtypen
Hinweise zur Paketverwaltung mit conda
Versuchen Sie es mit Pillow auf iPython (Teil 1)
Hinweise zur Verwendung von Pywinauto
Hinweise zur Verwendung von featuretools
Versuchen Sie es mit ArUco mit Raspberry Pi
Studie über die Miete in Tokio mit Python (3-2)
Versuchen Sie es mit Pillow auf iPython (Teil 3).
Verwenden einer seriellen Konsole unter Ubuntu 20.04
Hinweise zum Zugriff auf dashDB über Python
Installieren Sie Python unter CentOS mit Pyenv
Studie über die Miete in Tokio mit Python (3-3)
Hinweise zum Schreiben von require.txt
Hinweise zur Installation von Ubuntu 18.04 auf XPS 15 7590
Führen Sie Yocto unter Ubuntu mit QEMU aus.
Installieren Sie Python unter CentOS mit pyenv
Hinweise zum Festlegen der Pyenv- und Python-Umgebung mit Homebrew unter Mac OS Marvericks
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.