Heim  >  Artikel  >  Backend-Entwicklung  >  Flask-SQLAlchemy und Alembic: Best Practices für die Migration von Datenbanken in Python-Webanwendungen (Teil 2)

Flask-SQLAlchemy und Alembic: Best Practices für die Migration von Datenbanken in Python-Webanwendungen (Teil 2)

PHPz
PHPzOriginal
2023-06-17 20:34:381322Durchsuche

Flask-SQLAlchemy und Alembic: Best Practices für die Migration von Datenbanken in Python-Webanwendungen (Teil 2)

Im vorherigen Artikel haben wir besprochen, wie Flask-SQLAlchemy und Alembic zusammenarbeiten. In diesem Artikel wird hauptsächlich das Hinzufügen und Entfernen von Spalten in einigen grundlegenden Datenmodellen sowie das Ändern der Typen oder Einschränkungen einiger Spalten erläutert. Diese Änderungen kommen während der tatsächlichen Projektentwicklung sehr häufig vor.

Spalten hinzufügen und löschen

Bei der Verwendung von Flask-SQLAlchemy und Alembic für die Datenbankmigration kommt es sehr häufig zum Hinzufügen und Entfernen von Tabellenspalten. Um diesen Prozess zu demonstrieren, fügen wir dem folgenden Beispiel-Personenmodell einige neue Spalten hinzu.

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

Angenommen, wir möchten zwei neue Spalten hinzufügen, eine ist das Geburtsdatum (birthdate) und eine boolesche Spalte, die angibt, ob die Person verheiratet ist (is_married). Mit dem folgenden Befehl können wir ein Migrationsskript generieren:

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

Als nächstes müssen wir die generierte .py-Migrationsskriptdatei ändern, um neue Spalten hinzuzufügen. Wir können add_column() in der Funktion upgrade() verwenden.

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 ###

Zum Löschen von Spalten können wir die Funktion drop_column() im entsprechenden Destruktor degrade() verwenden, um die Spalte aus dem Datenbankmodell zu löschen.

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

Der vollständige Beispielcode für dieses Migrationsskript finden Sie unten.

"""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 ###

Spaltentypänderungen und Einschränkungsmodifikationen

In vielen Fällen müssen wir Änderungen an Spaltentypen und Einschränkungen vornehmen. Angenommen, wir möchten den Altersspaltentyp des Personenmodells von INTEGER in SMALLINT ändern. Um dies zu erreichen, können wir die Funktion alter_column() in der generierten .py-Migrationsskriptdatei verwenden.

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 ###

Wir können auch Einschränkungen für Spalten ändern. Bei der Untersuchung des Personenmodells stellen wir fest, dass es im Modell keine eindeutigen Wertbeschränkungen gibt. Mithilfe des folgenden Codes können wir eindeutige Wertbeschränkungen für die Spalten „Name“ und „Geburtsdatum“ hinzufügen.

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 ###

Wenn wir die Eindeutigkeitsbeschränkung später aufheben müssen, können wir die Funktion drop_constraint() verwenden. Zum Beispiel:

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 ###

Dieser Artikel behandelt einige häufige Arten von Datenbankschemaänderungen, wie das Hinzufügen und Entfernen von Spalten, das Ändern von Spalteneinschränkungen und das Ändern von Spaltendatentypen. Es demonstriert Best Practices für die Datenbankmigration mit Flask-SQLAlchemy und Alembic. Dadurch können Sie Ihr Datenbankschema effizienter verwalten und Migrationsdateien einfacher in einer Teamumgebung teilen.

Referenzlinks:

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

Das obige ist der detaillierte Inhalt vonFlask-SQLAlchemy und Alembic: Best Practices für die Migration von Datenbanken in Python-Webanwendungen (Teil 2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn