【问题标题】:SQLAlchemy does not create Foreign keys on MySQL [Debian Linux]SQLAlchemy 不在 MySQL [Debian Linux] 上创建外键
【发布时间】:2012-07-15 18:27:42
【问题描述】:

对于相同的代码 sn-p,SQLAlchemy 在 Mac OX 上创建外键约束,但是在 Debian Linux 上创建外键约束失败。

环境和图书馆:

Python 2.7

SQLAlchemy 0.7.8

MySQL-python-1.2.3 [这是连接器,我怀疑这里有问题]

代码片段:

class PRStatusCV(globalBase):

    __tablename__ = 'pr_status_cv'
    pr_status_cv_id = Column(Integer, primary_key=True)
    name            = Column(VARCHAR(100), nullable=False, unique=True)

    def __init__(self, id, name, desc):
        self.pr_status_cv_id = id
        self.name            = name
        self.description     = desc



class PhysicalRun(globalBase):

    __tablename__ = 'prs'
    pr_id       = Column(Integer, primary_key=True)
    run_name              = Column(VARCHAR(200), nullable=False, unique=True)
    pr_status_cv_id       = Column(Integer, ForeignKey('pr_status_cv.pr_status_cv_id'))

    def __init__(self, name, status):
        self.run_name              = name
        self.pr_status_cv_id       = status

在 Debian Linux 中,创建的表包含:

CREATE TABLE `prs` (
  `pr_id` int(11) NOT NULL AUTO_INCREMENT,
  `run_name` varchar(200) NOT NULL,
  `pr_status_cv_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`pr_id`),
  UNIQUE KEY `run_name` (`run_name`),
  KEY `pr_status_cv_id` (`pr_status_cv_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 

在 Mac OSX 中,创建的表如下所示:

CREATE TABLE `prs` (
  `pr_id` int(11) NOT NULL AUTO_INCREMENT,
  `run_name` varchar(200) NOT NULL,
  `pr_status_cv_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`pr_id`),
  UNIQUE KEY `run_name` (`run_name`),
  KEY `pr_status_cv_id` (`pr_status_cv_id`),
  CONSTRAINT `prs_ibfk_1` FOREIGN KEY (`pr_status_cv_id`) REFERENCES `pr_status_cv` (`pr_status_cv_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

观察: 似乎 Mac OSX SQLAlchemy 默认选择了 InnoDB DB Engine,而 Debian 选择了 MyISAM。知道为什么会这样吗?

我需要进行哪些修改才能获得约束 - CONSTRAINT `prs_ibfk_1` FOREIGN KEY (`pr_status_cv_id`) REFERENCES `pr_status_cv`,而不仅仅是 KEY `pr_status_cv_id` (`pr_status_cv_id`)

我的 Debian Python 部署有什么问题吗?

【问题讨论】:

  • 修复你的代码 sn-ps,它们不可读。
  • MyIsam 没有约束,所以你需要修复引擎问题所以解决关键问题

标签: python mysql sqlalchemy debian constraints


【解决方案1】:

ENGINE=MyISAMMyISAM 没有外键

添加 __table_args__ = {'mysql_engine':'InnoDB'} 以安装 InnoDB

【讨论】:

  • 谢谢普根。我添加了 __table_args__={'mysql_engine':'InnoDB'} 并且它似乎创建了带有约束的表。
【解决方案2】:

default-storage-enginge 很可能在两个系统中设置不同。另请查看option-files 了解如何配置此选项。理想情况下,您不应该将其保留为默认值;使用Table() 中的mysql_engine 选项将其强制用于mysql 连接。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2018-03-06
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    相关资源
    最近更新 更多