Je ne veux pas être épuisé par l'écriture manuscrite des scripts de mise à niveau et de rétrogradation pour la migration, j'ai donc présenté Alembic.
Alembic est un bel outil qui génère automatiquement des différences de mise à niveau et de rétrogradation par rapport au script de migration SQL Alchemy et à l'état du serveur.
L'installation se termine par pip
pip install sqlalchemy
pip install alembic
Il est nécessaire d'installer le pilote SQL pour python en fonction du SQL que vous utilisez (vous devez pouvoir vous connecter au serveur SQL pour faire la différence avec le serveur)
Cette fois, je l'ai utilisé dans MySQL.
pip install pymysql
Créez un répertoire de travail avec la commande alembic init.
alembic init [Nom du répertoire de travail]
Le fichier alembic.ini et le répertoire de travail spécifié sont créés. Il y a un fichier de paramètres appelé env.py dans le répertoire de travail, alors éditez ce fichier et deux fichiers, alembic.ini.
Tout d'abord, alembic.ini décrit les paramètres de connexion à MySQL. Réécrivez sqlalchemy.url.
sqlalchemy.url = mysql+pymysql://Nom d'utilisateur:mot de passe@nom d'hôte:Port/Nom de la base de données
※:Le nom du port est facultatif
Vous devez spécifier jusqu'au nom de la base de données. Étant donné que vous pouvez préparer plusieurs fichiers ini et les utiliser correctement lors de l'exécution, vous pouvez le gérer en préparant un fichier ini pour chaque base de données.
Réécrivez ensuite env.py dans votre répertoire de travail. Puisqu'il y a une ligne de commentaire # ajoutez ici l'objet MetaData de votre modèle, enregistrez une instance de la classe MetaData du script de définition de base de données pour SQLAlchemy pour la variable target_metadata en dessous.
Cela peut être un peu déroutant, donc tout d'abord, le script de définition de base de données pour l'exemple SQLAlchemy
sample.py
from sqlalchemy import MetaData, Table, Column, Integer, String, DateTime, Float, Boolean, Text
from sqlalchemy.dialects.mysql import TINYINT, SMALLINT
meta = MetaData()
Table(
'status', meta,
Column('account_id', Integer, primary_key=True, autoincrement=False),
Column('hp', SMALLINT, nullable=False, server_default='30'),
Column('weapon_id', SMALLINT, nullable=False, server_default='1'),
Column('weapon_lv', TINYINT, nullable=False, server_default='0'),
Column('armor_id', SMALLINT, nullable=False, server_default='1'),
Column('armor_lv', TINYINT, nullable=False, server_default='0'),
)
S'il y avait,
env.py
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
import sample
target_metadata = sample.meta
Écrivez comme ça.
Pour importer le fichier sample.py, vous devez spécifier l'emplacement du fichier dans PYTHONPATH. Même s'il est actuel, vous devez le spécifier.
PYTHONPATH=. alembic revision --autogenerate
Lors de la préparation de plusieurs alembic.ini, modifiez le nom du fichier, puis spécifiez-le avec l'option --config.
PYTHONPATH=. alembic --révision du fichier config ini--autogenerate
En ajoutant --autogenerate, la différence entre le serveur actuel et le script SQLAlchemy spécifié est prise dans le répertoire appelé versions dans le répertoire de travail, et le script comprenant la mise à niveau et la rétrogradation est automatiquement généré.
Ensuite, modifiez le fichier source de la migration spécifié dans le fichier ini et générez un fichier de différences avec la commande de révision alambic. Même si vous faites une erreur et faites un script de réglage étrange, vous pouvez dire que si vous venez de le faire, vous n'avez pas simplement supprimé le fichier généré.
Les scripts créés avec la révision d'alambic peuvent être appliqués au serveur à l'aide de la mise à niveau d'alambic. Vous pouvez mettre à niveau ou rétrograder vers n'importe quelle révision de votre choix, mais la plupart du temps, vous mettrez à jour avec la dernière version. Spécifiez la tête à mettre à jour vers la dernière version.
PYTHONPATH=. alembic --tête de mise à niveau du fichier config ini
alembic est une gestion de version simple qui crée une table appelée alembic_version dans DB et stocke le nom du fichier (à l'exclusion du dernier _) dans version_num.
Ainsi, si vous définissez le dernier nom de fichier dans les versions sur version_num après avoir ajusté la base de données à la dernière version, il n'y aura pas d'écart de version.
Si vous supprimez le script dans les versions sous le répertoire de travail et la table alembic_version dans la base de données, vous pouvez supposer qu'il n'y avait pas de réglage par alembic.