Как я удаляю ограничение внешнего ключа в SQLAlchemy?

Я использую 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? Как я могу удалить внешний ключ и затем столбец?

7
задан kay 20 September 2012 в 16:34
поделиться

2 ответа

я смог добиться этого, создав отдельный экземпляр метаданных и используя Session.execute () для выполнения необработанного SQL. В идеале было бы решение, которое использует исключительно sqlalchemy, поэтому мне не пришлось бы использовать решения, специфичные для MySQL. Но на данный момент я не знаю такого решения.

3
ответ дан 7 December 2019 в 07:43
поделиться

Что ж, вы можете добиться этого в 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)
-1
ответ дан 7 December 2019 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: