使用sqlalchemy定义MySQL

时间:2015-05-08 18:54:51

标签: python mysql sqlalchemy

我正在使用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匹配(如果在类型='type1'的experiment_types中的条目具有id = 1,那么在实验中使用type ='type1的条目'应该有一个sub_id = 1)。我甚至不确定这是否是在这种情况下确定关系的最佳方法 所以欢迎任何建议。

当前的错误消息是:

sqlalchemy.exc.ArgumentError:无法在关系Experiments.experiments上找到主要连接条件“0 = 1”的任何相关外键列。确保引用列与ForeignKey或ForeignKeyConstraint相关联,或者在带有foreign()注释的连接条件中进行注释。

1 个答案:

答案 0 :(得分: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