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

PHPz
Freigeben: 2023-06-17 20:34:38
Original
1340 Leute haben es durchsucht

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
Nach dem Login kopieren

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"
Nach dem Login kopieren

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 ###
Nach dem Login kopieren

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 ###
Nach dem Login kopieren

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 ###
Nach dem Login kopieren

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 ###
Nach dem Login kopieren

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 ###
Nach dem Login kopieren

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 ###
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage