2012-07-16 20 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