2012-07-16 53 views
3

对于相同的代码片段,SQLAlchemy会在Mac OX上创建外键约束,但是它无法在Debian Linux上创建外键约束。SQLAlchemy不在MySQL上创建外键[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数据库引擎,并且为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部署有什么不正确?

+0

修复代码片段,它们不可读。 – glyphobet 2012-07-16 20:48:24

+0

MyIsam没有限制,因此您需要修复引擎问题,以便解决关键问题 – 2012-07-16 20:52:16

+0

+1作为对他人的警告。 – SingleNegationElimination 2012-07-16 21:01:15

回答

1

ENGINE=MyISAM的MyISAM不到风度有外键

添加__table_args__ = {'mysql_engine':'InnoDB'}让InnoDB的insted的

+0

感谢Puggan。我添加了__table_args __ = {'mysql_engine':'InnoDB'},它似乎创建了约束表。 – Aijazs 2012-07-16 20:57:52