gpt4 book ai didi

python - 如何删除 SQLAlchemy 中的外键约束?

转载 作者:太空狗 更新时间:2023-10-29 21:44:43 29 4
gpt4 key购买 nike

我正在使用 SQLAlchemy Migrate 来跟踪数据库更改,但我遇到了删除外键的问题。我有两个表,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 删除外键?如何删除外键,然后删除列?

最佳答案

您可以使用 sqlalchemy.migrate 来完成。

为了让它工作,我必须显式创建外键约束,而不是隐式地使用 Column('fk', ForeignKey('fk_table.field')):

唉,与其这样做:

p2 = Table('tablename',
metadata,
Column('id', Integer, primary_key=True),
Column('fk', ForeignKey('fk_table.field')),
mysql_engine='InnoDB',
)

这样做:

p2 = Table('tablename',
metadata,
Column('id', Integer, primary_key=True),
Column('fk', Integer, index=True),
mysql_engine='InnoDB',
)
ForeignKeyConstraint(columns=[p2.c.fk], refcolumns=[p3.c.id]).create()

那么删除过程是这样的:

def downgrade(migrate_engine):
# First drop the constraint
ForeignKeyConstraint(columns=[p2.c.fk], refcolumns=[p3.c.id]).drop()
# Then drop the table
p2.drop()

关于python - 如何删除 SQLAlchemy 中的外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427199/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com