2015-02-23 4 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) 

Поскольку я изменил Engine на InnoDB, внешние ключи создаются, что нежелательно. Проблема в том, что SQLAlchemy использует определения внешнего ключа для определения отношений.

Есть ли способ предотвратить создание внешних ключей или определить отношения без добавления внешних ключей?

+0

Почему вы хотите, чтобы предотвратить создание внешних ключей? –

+0

@SlaterTyranus Я не использую MySQL, поэтому я не могу быть уверен, но это может иметь какое-то отношение к микшированию MyISAM и InnoDB. – davidism

+0

@SlaterTyranus, потому что любая из подключенных таблиц - myIsam, и я не могу их изменить далее. Эта таблица огромна, и я использую разделы, и вы можете использовать разделы, если у вас есть FK. –

ответ

0

Я получил решение от другого форума -

вместо join(clips_table.Clips) Я использовал join(signals_table.Signals.clips)

1

При создании отношений SQLAlchemy использует ForeignKey s для определения того, к каким столбцам присоединиться. Вы можете, конечно, 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', 
) 

Как правило, однако, вы хотите использовать внешние ключи.

Смежные вопросы