Tra*_*vis 7 python mysql sqlalchemy foreign-keys mysql-error-1025
我正在使用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
)
)
Run Code Online (Sandbox Code Playgroud)
这很好用:
t_new.create()
t_exists.c.new_id.create()
Run Code Online (Sandbox Code Playgroud)
但这不是:
t_exists.c.new_id.drop()
t_new.drop()
Run Code Online (Sandbox Code Playgroud)
尝试删除外键列会出现错误:1025,"将'.\ my_db_name \#sql-1b0_2e6'重命名为'.\ my_db_name\exists'(错误号: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',
)
Run Code Online (Sandbox Code Playgroud)
去做:
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()
Run Code Online (Sandbox Code Playgroud)
然后删除过程如下所示:
def downgrade(migrate_engine):
# First drop the constraint
ForeignKeyConstraint(columns=[p2.c.fk], refcolumns=[p3.c.id]).drop()
# Then drop the table
p2.drop()
Run Code Online (Sandbox Code Playgroud)