Я использую SQLAlchemy, Мигрируют для отслеживания изменения базы данных, и я сталкиваюсь с проблемой с удалением внешнего ключа. У меня есть две таблицы, t_new является новой таблицей, и t_exists является существующей таблицей. Я должен добавить t_new, затем добавить внешний ключ к t_exists. Затем я должен смочь инвертировать операцию (который является, где я испытываю затруднения).
t_new = sa.Table("new", meta.metadata,
sa.Column("new_id", sa.types.Integer, primary_key=True)
)
t_exists = sa.Table("exists", meta.metadata,
sa.Column("exists_id", sa.types.Integer, primary_key=True),
sa.Column(
"new_id",
sa.types.Integer,
sa.ForeignKey("new.new_id", onupdate="CASCADE", ondelete="CASCADE"),
nullable=False
)
)
Это хорошо работает:
t_new.create()
t_exists.c.new_id.create()
Но это не делает:
t_exists.c.new_id.drop()
t_new.drop()
Попытка отбросить столбец внешнего ключа дает ошибку: 1025, "Ошибка на переименовывает '.\my_db_name\#sql-1b0_2e6' к.\my_db_name\exists, '(errno: 150)"
Если я делаю это с необработанным SQL, я могу удалить внешний ключ, вручную затем удаляют столбец, но я не смог выяснить, как удалить внешний ключ с SQLAlchemy? Как я могу удалить внешний ключ и затем столбец?
я смог добиться этого, создав отдельный экземпляр метаданных и используя Session.execute () для выполнения необработанного SQL. В идеале было бы решение, которое использует исключительно sqlalchemy, поэтому мне не пришлось бы использовать решения, специфичные для MySQL. Но на данный момент я не знаю такого решения.
Что ж, вы можете добиться этого в sqlalchemy: просто drop ()
все ограничения перед тем, как drop ()
столбец (теоретически у вас может быть несколько ограничений):
def drop_column(column):
for fk in column.table.foreign_keys:
if fk.column == column:
print 'deleting fk ', fk
fk.drop()
column.drop()
drop_column(t_exists.c.new_id)