Определение отношения без фактического создания внешних ключей

У меня есть таблица, для которой я изменил движок 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 использует определения внешнего ключа для определения соединения отношений.

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


person Eli Rashlin    schedule 23.02.2015    source источник
comment
Почему вы хотите предотвратить создание внешних ключей?   -  person Slater Victoroff    schedule 23.02.2015
comment
@SlaterTyranus, потому что любая из подключенных таблиц - это myIsam, и я не могу их изменить, кроме того. Эта таблица огромна, и я использую разделы, и вы можете использовать разделы, когда у вас определен FK.   -  person Eli Rashlin    schedule 24.02.2015


Ответы (2)


При создании отношения SQLAlchemy использует ForeignKeys, чтобы определить, какие столбцы объединяются. Конечно, вы можете переопределить это любым условием соединения, которое вы хочу. Вы уже почти это делаете, вам просто нужно удалить 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',
)

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

person davidism    schedule 23.02.2015

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

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

person Eli Rashlin    schedule 25.02.2015