`alembic review --autogenerate` производит избыточную миграцию внешнего ключаPython

Программы на Python
Ответить
Anonymous
 `alembic review --autogenerate` производит избыточную миграцию внешнего ключа

Сообщение Anonymous »

Версии программного обеспечения: перегонный куб 1.0.5, SQLAlchemy 1.2.14, MySQL 5.7, Python 3.6.7

Я пытаюсь использовать перегонный куб для согласования схемы базы данных MySQL и представления ORM Python.

Проблема, которую я вижу, заключается в том, что при миграции всегда есть избыточные команды удаления и создания для внешних ключей. Кажется, что автогенерация считает что-то другим, но на самом деле это одно и то же.

При повторном вызове команд:

Код: Выделить всё

alembic revision --autogenerate
alembic upgrade head
... выполнит те же команды drop и create.

регистрация на стандартный вывод показывает что-то вроде (например):

Код: Выделить всё

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
и скрипт миграции имеет:

Код: Выделить всё

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 ###
Эту проблему можно повторить, и я сделал минимальный пример (tar.gz на https://github.com/sqlalchemy/alembic/f ... est.tar.gz). ORM в этом примере выглядит примерно так:

Код: Выделить всё

[...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'),
)
Можно ли что-нибудь сделать, чтобы перегонный куб «видел» FK в базе данных как такие же, как и в ORM? Например, применить некоторую конфигурацию через env.py?

Я изучил эту проблему и обнаружил несколько старых проблем в перегонном кубе GitHub (см. [1],[2],[3]). Проблемы, у которых есть решения, похоже, связаны с базами данных postgres и общедоступностью схемы. Я не уверен, что это применимо к данному случаю, поскольку я использую MySQL; Соответствующая документация для общедоступных схем Postgres находится здесь: https://docs.sqlalchemy.org/en/latest/d ... earch-path

Теперь я добавил свою собственную проблему в репозиторий перегонного куба GitHub: https://github.com/sqlalchemy/alembic/issues/519



Закрытые проблемы в системе отслеживания проблем перегонного куба, которые показывают схожие симптомы, но решения которых не применяются (насколько я вижу):

[1] https://github.com/sqlalchemy/alembic/issues/444

[2] https://github.com/sqlalchemy/alembic/issues/398

[3] https://github.com/sqlalchemy/alembic/issues/293

Подробнее здесь: https://stackoverflow.com/questions/535 ... migrations
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»