[PYTHON] Remarques sur l'utilisation d'Alembic

Alembic est un outil de migration pour sqlalchemy, un orm python. Il n'y a pas beaucoup d'articles en japonais et je ne me suis souvent pas rendu compte que je l'utilisais, alors je vais écrire le point.

Alembic:http://alembic.zzzcomputing.com/en/latest/

Je souhaite gérer plusieurs fichiers de modèle

Lorsqu'il existe plusieurs fichiers de modèle, il est nécessaire de combiner les métadonnées de la classe Base. http://liuhongjiang.github.io/hexotech/2015/10/14/alembic-support-multiple-model-files/ La méthode décrite dans ce blog fonctionne. Dans mon cas, j'ai essayé d'utiliser l'importation dynamique.

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

Ne détecte pas le changement de type

Si vous conservez le même nom de colonne, il ne détectera pas le changement de type. Il semble que cela soit défini par défaut. http://stackoverflow.com/questions/17174636/can-alembic-autogenerate-column-alterations Ceci est également modifié comme dans cet article.

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 #ajouter à
        )

        with context.begin_transaction():
            context.run_migrations()

Jugez Boolean et Tinyint comme des types différents

Maintenant que vous êtes conscient du changement de type, vous rencontrez des problèmes avec le type booléen. Boolean est défini par tinyint dans mysql, mais lors de la comparaison, il est jugé que le type est différent et il essaie de supprimer et de créer des colonnes à chaque fois. De plus, même si je change le type de tinyint à integer, il ne peut pas être détecté correctement.

Si vous le corrigez avec le sentiment qu'il est écrit en référence à ici, cela fonctionnera. J'ai essayé comme suit.

env.py


#ajouter à
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 #Changement
        )

        with context.begin_transaction():
            context.run_migrations()

Puisque l'alambic a de nombreuses fonctions et de nombreuses fonctions que je n'ai pas encore utilisées, j'ajouterai ce à quoi j'étais accro plus tard.

Recommended Posts

Remarques sur l'utilisation d'Alembic
[Django] Remarques sur l'utilisation de django-debug-toolbar
Remarques sur l'utilisation de MeCab depuis Python
Remarques sur l'utilisation de la post-réception et de la post-fusion
Remarques sur l'installation de Python à l'aide de PyEnv
Notes sur l'utilisation de rstrip avec python.
Remarques sur l'utilisation de matplotlib sur le serveur
(Débutant) Remarques sur l'utilisation de pyenv sur Mac
Notes sur Flask
Remarques sur l'utilisation d'OpenCV avec Windows10 Python 3.8.3.
Remarques sur la mise en œuvre des tests APN à l'aide de Pytest
Remarques sur les réseaux de neurones
Notes de céleri sur Django
Remarques sur l'utilisation de dict avec python [Competition Pro]
Remarques sur l'installation de PycURL
Remarques sur l'utilisation de TensorFlow sur Bash sur Ubuntu sous Windows
Remarques sur les fonctions de la famille SciPy.linalg
[Python] Remarques sur l'accélération des algorithmes génétiques à l'aide du multitraitement
Notes minimales lors de l'utilisation de Python sur Mac (édition Homebrew)
Remarques sur tf.function et traçage
Remarques sur l'installation de dlib sur Mac
Notes sur le module sqlite3 de python
Remarques sur les * args et ** kargs
Remarques sur la définition des slots PySide (2)
Essayez d'utiliser OpenCV sur Windows
Notes sur pyenv et Atom
Précautions lors de la définition des emplacements pour PySide
[Python] Notes sur l'analyse des données
Remarques sur l'installation de Python sur votre Mac
Traiter sur GPU en utilisant chainer.cuda.elementwise
Remarques sur l'installation de pipenv sur votre Mac
Diffusion sur LINE en utilisant python
Remarques sur l'installation d'Anaconda 3 sur Windows
Remarques sur imshow () d'OpenCV
Remarques sur l'installation de Python sur CentOS
Notes sur Python et les types de dictionnaire
Remarques sur la gestion des packages avec conda
Essayez d'utiliser Pillow sur iPython (partie 1)
Remarques sur l'utilisation de pywinauto
Remarques sur l'utilisation des featuretools
Essayez d'utiliser ArUco avec Raspberry Pi
Étude sur Tokyo Rent en utilisant Python (3-2)
Essayez d'utiliser Pillow sur iPython (partie 3)
Utilisation d'une console série sur Ubuntu 20.04
Remarques sur l'accès à dashDB à partir de python
Installer Python sur CentOS à l'aide de Pyenv
Étude sur Tokyo Rent en utilisant Python (3-3)
Remarques sur la rédaction de requirements.txt
Remarques sur l'installation d'Ubuntu 18.04 sur XPS 15 7590
Exécutez Yocto sur Ubuntu en utilisant QEMU.
Installez Python sur CentOS en utilisant pyenv
Remarques sur la configuration de l'environnement pyenv et python à l'aide de Homebrew sur Mac OS Marvericks
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.