Ich versuche, mit alembic ein MySQL-Datenbankschema und die Python-ORM-Darstellung im Gleichschritt zu halten.
Das Problem, das ich sehe, ist, dass die Migrationen immer über redundante Drop- und Create-Befehle für Fremdschlüssel verfügen. Es scheint, dass Autogenerate etwas als anders ansieht, aber in Wirklichkeit sind sie gleich.
Bei wiederholten Aufrufen der Befehle:
Code: Select all
alembic revision --autogenerate
alembic upgrade head
Die Protokollierung in stdout zeigt etwa Folgendes an (z. B.):
Code: Select all
INFO [alembic.autogenerate.compare] Detected removed foreign key (t1_id)(id) on table table_two
INFO [alembic.autogenerate.compare] Detected added foreign key (t1_id)(id) on table test_fktdb.table_two
Code: Select all
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('fk_table1', 'table_two', type_='foreignkey')
op.create_foreign_key('fk_table1', 'table_two', 'table_one', ['t1_id'], ['id'], source_schema='test_fktdb', referent_schema='test_fktdb')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('fk_table1', 'table_two', schema='test_fktdb', type_='foreignkey')
op.create_foreign_key('fk_table1', 'table_two', 'table_one', ['t1_id'], ['id'])
# ### end Alembic commands ###
Code: Select all
[...import and bobs...]
class TableOne(Base):
"""Class representing a table with an id."""
__tablename__ = "table_one"
id = Column(UNSIGNED_INTEGER, nullable=False, autoincrement=True, primary_key=True)
__table_args__ = (
dict(mysql_engine='InnoDB'),
)
class TableTwo(Base):
"""A table representing records with a foreign key link to table one."""
__tablename__ = "table_two"
id = Column(UNSIGNED_INTEGER, nullable=False, autoincrement=True, primary_key=True)
t1_id = Column(UNSIGNED_INTEGER, nullable=False)
__table_args__ = (
ForeignKeyConstraint(["t1_id"], ["test_fktdb.table_one.id"], name="fk_table1"),
dict(mysql_engine='InnoDB'),
)
Ich habe mich nach diesem Problem umgesehen und einige alte Probleme im alembic GitHub gefunden (siehe [1],[2],[3]). Die Probleme, für die es Lösungen gibt, scheinen damit zu tun zu haben, dass Postgres-Datenbanken und das Schema öffentlich sind. Ich bin mir nicht sicher, ob dies auf diesen Fall zutrifft, da ich MySQL verwende. Die zugehörige Dokumentation für öffentliche Postgres-Schemas finden Sie hier: https://docs.sqlalchemy.org/en/latest/d ... earch-path
Ich habe jetzt mein eigenes Problem zum alembic GitHub-Repo hinzugefügt: https://github.com/sqlalchemy/alembic/issues/519
Geschlossene Probleme im Alembic Issue Tracker, die ähnliche Symptome zeigen, deren Lösungen aber nicht zutreffen (soweit ich sehen kann):
[1] https://github.com/sqlalchemy/alembic/issues/444
[2] https://github.com/sqlalchemy/alembic/issues/398
[3] https://github.com/sqlalchemy/alembic/issues/293
Mobile version