2015-02-23 26 views
1

我有一張表,我已經將MySQL引擎從MyISAM更改爲InnoDB。這是唯一已更改的表,與其相關的表仍使用MyISAM。定義一個關係,但實際上並沒有創建外鍵

class Signals(Base, sql_functions): 
    __tablename__ = 'Signals' 

    def __init__(self, message_id=None, clip_id=None, signal_id=None): 
     self.message_id = message_id 
     self.clip_id = clip_id 
     self.signal_id = signal_id 

    __table_args__ = { 
     'mysql_engine': 'InnoDB', 
     'mysql_charset': 'utf8' 
    } 

    __mapper_args__= {'always_refresh': True} 

    id = Column(Integer(10), primary_key=True) 
    message_id = Column(Integer(10), ForeignKey('Messages.id')) 
    clip_id = Column(Integer(10), ForeignKey('Clips.id')) 
    signal_id = Column(Integer(10), ForeignKey('Signal_names.id'), primary_key=True) 

    sig_name = relationship("SignalNames", backref=backref('Signals', order_by=id), primaryjoin = 'Signals.signal_id == SignalNames.id', foreign_keys='SignalNames.id') 
    clips = relationship("Clips", backref=backref('Signals', order_by=id), primaryjoin='Signals.clip_id == Clips.id', foreign_keys='Clips.id') 
    messages = relationship("Messages", backref=backref('Signals', order_by=id), primaryjoin='Signals.message_id == Messages.id', foreign_keys='Messages.id') 

    def __repr__(self): 
     return "<Signals ('%s %s %s')>" % (self.message_id, self.clip_id) 

    Index('idx_msg_id', Signals.message_id) 

由於我已將引擎更改爲InnoDB,因此正在創建外鍵,這不是所期望的。問題是SQLAlchemy正在使用外鍵定義來定義關係連接。

有沒有辦法來防止創建外鍵或定義關係而不添加外鍵?

+0

你爲什麼要阻止外鍵的創造? – 2015-02-23 15:23:40

+0

@SlaterTyranus我不使用MySQL,所以我不能確定,但​​它可能與混合MyISAM和InnoDB有關。 – davidism 2015-02-23 15:26:00

+0

@SlaterTyranus,因爲連接的任何表都是myIsam,而且我不能更改它們。此表很大,我使用分區,並且當您定義了FK時可以使用分區。 – 2015-02-24 08:52:12

回答

0

我從另一個論壇的解決方案 - 的

代替 join(clips_table.Clips) 我用 join(signals_table.Signals.clips)

1

創建關係時,SQLAlchemy使用ForeignKey來檢測要加入的列。你當然可以override that with whatever join condition you want。你幾乎已經這麼做了,你只需要從每列中刪除ForeignKey,併爲每個關係正確定義外部列。

signal_id = Column(Integer(10), primary_key=True) 

sig_name = relationship(
    'SignalNames', 
    primaryjoin='Signals.signal_id == SignalNames.id', 
    foreign_keys='Signals.signal_id', 
    remote_side='SignalNames.id', 
) 

通常,不過,要使用外鍵。

相關問題