Дефинирайте връзка, без всъщност да създавате външни ключове

Имам таблица, за която смених 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 използва дефинициите на външния ключ, за да дефинира връзките на връзката.

Има ли начин да се предотврати създаването на външни ключове или да се дефинират връзките без добавяне на външни ключове?


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