2015-05-08 3 views
1

Я работаю с sqlalchemy и MySQL для создания базы данных. В настоящее время у меня возникают проблемы с определением конкретной связи между двумя таблицами.Использование sqlalchemy для определения отношений в MySQL

class Experiment_Type(Base): 
    __tablename__='experiment_types' 

    id = Column(Integer, primary_key=True) 
    type = Column(String(100)) 


class Experiments(Base): 
    __tablename__ = 'experiments' 

    id = Column(Integer, primary_key=True) 
    type = Column(String(100)) 
    sub_id = Column(Integer, ForeignKey('experiment_types.id')) 

    experiments = relationship('Experiments', 
    primaryjoin="and_(Experiment_Type.id == Experiments.sub_id, 
    'Experiments.type' == 'Experiment_Type.type')", 
    backref=backref('link')) 

То, что я хочу сделать, это иметь значения sub_id в экспериментах соответствует идентификатору experiment_types в зависимости от типа (если запись в experiment_types типа = «типа1» имеет ID = 1, то запись в экспериментах с type = 'type1' должен иметь sub_id = 1). Я даже не уверен, что это лучший способ приблизиться к определению отношений в этой ситуации , поэтому любые советы приветствуются.

Текущее сообщение об ошибке заключается в следующем:

sqlalchemy.exc.ArgumentError: Не удалось найти какие-либо соответствующие столбцы внешнего ключа для первичного присоединиться к условию «0 = 1» на отношения Experiments.experiments. Убедитесь, что ссылки на столбцы связаны с ForeignKey или ForeignKeyConstraint или аннотируются в состоянии соединения с помощью аннотации foreign().

ответ

1

Весь смысл настройки отношений в реляционных dbs состоит в том, чтобы не дублировать данные по таблицам. Просто сделать что-то вроде этого:

class ExperimentType(Base): 
    __tablename__='experiment_types' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(100)) 


class Experiments(Base): 
    __tablename__ = 'experiments' 

    id = Column(Integer, primary_key=True) 
    description = Column(String(100)) 
    type_id = Column(Integer, ForeignKey('experiment_types.id')) 

    type = relationship("ExperimentType") 

Затем, если необходимо отобразить тип эксперимента материал позже, может получить доступ к нему что-то вроде:

exp = session.query(Experiment).first() 
print exp.type.name 
Смежные вопросы