2015-05-08 26 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的ID(如果類型experiment_types條目=「類型1」有ID = 1,那麼實驗中以進入type ='type1'應該有一個sub_id = 1)。我甚至不確定這是否是在這種情況下定義關係的最好方法 所以任何建議都是值得歡迎的。

當前的錯誤信息是這樣的:

sqlalchemy.exc.ArgumentError:找不到上關係Experiments.experiments初級連接條件「0 = 1」的任何相關的外鍵列。確保引用列與ForeignKey或ForeignKeyConstraint關聯,或者在連接條件中使用foreign()註釋進行註釋。

回答

1

在關係數據庫中設置關係的關鍵是不必在表間複製數據。剛做這樣的事情:

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