Maison  >  Article  >  développement back-end  >  Flask-SQLAlchemy et Alembic : Bonnes pratiques pour migrer des bases de données dans des applications Web Python (Partie 2)

Flask-SQLAlchemy et Alembic : Bonnes pratiques pour migrer des bases de données dans des applications Web Python (Partie 2)

PHPz
PHPzoriginal
2023-06-17 20:34:381267parcourir

Flask-SQLAlchemy et Alembic : Meilleures pratiques pour migrer des bases de données dans des applications Web Python (Partie 2)

Dans l'article précédent, nous avons expliqué comment Flask-SQLAlchemy et Alembic fonctionnent ensemble. Cet article présentera principalement comment ajouter et supprimer des colonnes dans certains modèles de données de base, et modifier les types ou les contraintes de certaines colonnes. Ces changements sont très courants lors du développement réel du projet.

Ajout et suppression de colonnes

Lors de l'utilisation de Flask-SQLAlchemy et Alembic pour la migration de bases de données, l'ajout et la suppression de colonnes de table sont très courants. Pour illustrer ce processus, nous ajouterons de nouvelles colonnes à l’exemple de modèle Person suivant.

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255), nullable=False)
    age = db.Column(db.Integer)

    def __repr__(self):
        return '<Person %r>' % self.name

Supposons que nous souhaitions ajouter deux nouvelles colonnes, l'une est la date de naissance (birthdate) et une colonne booléenne indiquant si la personne est mariée (is_married). Nous pouvons utiliser la commande suivante pour générer un script de migration :

$ alembic revision -m "add birthdate, is_married columns to person"

Ensuite, nous devons modifier le fichier de script de migration .py généré pour ajouter de nouvelles colonnes. Nous pouvons utiliser add_column() dans la fonction upgrade().

from alembic import op
import sqlalchemy as sa

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('person', sa.Column('birthdate', sa.Date(), nullable=True))
    op.add_column('person', sa.Column('is_married', sa.Boolean(), nullable=True))
    # ### end Alembic commands ###

Pour supprimer des colonnes, nous pouvons utiliser la fonction drop_column() dans le destructeur correspondant degrade() pour supprimer la colonne du modèle de base de données.

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_column('person', 'birthdate')
    op.drop_column('person', 'is_married')
    # ### end Alembic commands ###

L'exemple de code complet de ce script de migration se trouve ci-dessous.

"""add birthdate, is_married columns to person"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'eab2c4f1c9fb'
down_revision = '7cfae59c2402'
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column('person', sa.Column('birthdate', sa.Date(), nullable=True))
    op.add_column('person', sa.Column('is_married', sa.Boolean(), nullable=True))
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_column('person', 'birthdate')
    op.drop_column('person', 'is_married')
    # ### end Alembic commands ###

Changements de type de colonne et modifications de contraintes

Dans de nombreux cas, nous devons apporter des modifications aux types de colonnes et aux contraintes. Supposons que nous souhaitions changer le type de colonne age du modèle Person de INTEGER à SMALLINT. Nous pouvons utiliser la fonction alter_column() dans le fichier de script de migration .py généré pour y parvenir.

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('person', 'age', existing_type=sa.Integer(),
               type_=sa.SmallInteger(), nullable=True)
    # ### end Alembic commands ###

Nous pouvons également modifier les contraintes sur les colonnes. En examinant le modèle Personne, nous remarquons qu'il n'y a pas de contraintes de valeur unique dans le modèle. Nous pouvons ajouter des contraintes de valeur unique pour les colonnes de nom et de date de naissance en utilisant le code suivant.

from alembic import op
import sqlalchemy as sa

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_unique_constraint(op.f('uq_person_name'), 'person', ['name'])
    op.create_unique_constraint(op.f('uq_person_birthdate'), 'person', ['birthdate'])
    # ### end Alembic commands ###

Si nous devons annuler la contrainte de valeur unique plus tard, nous pouvons utiliser la fonction drop_constraint(). Par exemple :

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint(op.f('uq_person_name'), 'person', type_='unique')
    op.drop_constraint(op.f('uq_person_birthdate'), 'person', type_='unique')
    # ### end Alembic commands ###

Cet article couvre certains types courants de modifications du schéma de base de données, tels que l'ajout et la suppression de colonnes, la modification des contraintes de colonne et la modification des types de données de colonne. Il démontre les meilleures pratiques pour la migration de bases de données à l'aide de Flask-SQLAlchemy et Alembic. Cela vous aidera à gérer votre schéma de base de données plus efficacement et à partager plus facilement les fichiers de migration dans un environnement d'équipe.

Liens de référence :

  • Flask-SQLAlchemy - https://flask-sqlalchemy.palletsprojects.com/
  • Alembic - https://alembic.sqlalchemy.org/en/latest/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn