【问题标题】:SQLAlchemy configration for MySQL's "SET foreign_key_checks = 0"MySQL“SET foreign_key_checks = 0”的SQLAlchemy配置
【发布时间】:2016-08-07 20:24:00
【问题描述】:

我正在使用带有 Flask 的 SQLAlchemy 创建数据库表 - 每个表至少有一个外键 - 它适用于 sqlite 但不适用于 MySQL - 在 MySQL 中创建表时出现外键完整性错误(未创建父表创建子表时)。我使用“SET foreign_key_checks = 0”来解决问题,但这不适用于 sqlite。有没有办法将 SQLAlchemy 配置为忽略外键检查?

【问题讨论】:

  • sqlite 默认不强制使用外键。
  • 听起来你实际上在问什么有没有办法配置 SQLAlchemy 告诉 MySQL 忽略外键检查?(以一种同时与 sqlite 不兼容的方式)?

标签: mysql sqlite sqlalchemy flask-migrate


【解决方案1】:

首先,为什么要忽略外键约束?当您定义外键时,您可以传递带有外表和列名的字符串,即使尚未创建外表,这些也会正确解析。

但无论如何,如果您想拥有不强制执行的外键,请不要将外键列定义为外键,将它们定义为简单列并自行管理外键依赖关系。在我看来,这不是一个好主意,但可以做到。

【讨论】:

  • 如果我不添加“SET foreign_key_checks = 0” - 在使用 MySQL 升级运行 db migrate 脚本时,我无法创建表。我不明白“当您定义外键时,您可以传递带有外表和列名的字符串”,这就是我定义外键的方式:class Author(db.Model): ... paper_id = db.Column (db.Integer, db.ForeignKey('papers.id'))
  • @harryw 你在同一个迁移中有一个papers 表吗?
  • 是的,但是作者表是在迁移脚本中首先创建的表,以后不会创建论文——这对 sqlite 来说很好,但对 mysql 则不然。谢谢!
  • 我得到的错误:sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint')
【解决方案2】:

如果你是用户mysql,你可以连接到mysql并使用SET GLOBAL FOREIGN_KEY_CHECKS = 0;删除你想要的db表,然后再次SET GLOBAL FOREIGN_KEY_CHECKS = 1;。此值验证 db 表中的外部关系。

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 2013-06-18
    • 1970-01-01
    • 2017-07-04
    • 2013-01-05
    • 2014-07-28
    • 1970-01-01
    • 2015-04-13
    • 2016-04-14
    相关资源
    最近更新 更多