„alembic revision --autogenerate“ erzeugt redundante FremdschlüsselmigrationenPython

Python-Programme
Anonymous
 „alembic revision --autogenerate“ erzeugt redundante Fremdschlüsselmigrationen

Post by Anonymous »

Softwareversionen: alembic 1.0.5, SQLAlchemy 1.2.14, MySQL 5.7, Python 3.6.7

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
...erzeugt die gleichen Drop- und Create-Befehle.

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
und das Migrationsskript hat:

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 ###
Dieses Problem kann repliziert werden und ich habe ein Minimalbeispiel erstellt (eine tar.gz auf https://github.com/sqlalchemy/alembic/f ... est.tar.gz). Der ORM im Beispiel sieht etwa so aus:

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'),
)
Kann man irgendetwas tun, damit Alembic erkennt, dass die FKs in der Datenbank mit denen im ORM identisch sind? Anwenden einer Konfiguration beispielsweise über env.py?

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post