许多模型与SQLAlchemy连接

时间:2011-06-16 15:07:30

标签: python model sqlalchemy foreign-key-relationship

我正在努力让很多人加入到使用SQLAlchemy中的模型工作。我在网上找到了很多例子,但我似乎无法弄清楚他们的字符串是否代表他们喜欢的列名与数据库表实际拥有的列名,或者他们使用的是Table而不是声明性模型,或其他不同的东西,他们的例子不起作用。我目前有以下设置:

  • 数据库表格TAG_TEST,TAG和TEST
  • TAG_TEST有TS_TEST_ID,TG_TAG_ID和TG_TYPE(外键)
  • TAG具有TG_TAG_ID和TG_TYPE
  • TEST具有TS_TEST_ID

我有以下型号:

class Test(Base):
    from .tag import Tag
    from .tag_test import TagTest

    __tablename__ = u'TEST'
    id = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False)
    ...
    tags = relationship(Tag, secondary='TAG_TEST')

class Tag(Base):
    from .tag_test import TagTest
    __tablename__ = "TAG"
    id = Column(u'TG_TAG_ID', INTEGER(), primary_key=True, nullable=False)
    type = Column(u'TG_TYPE', VARCHAR(25))
    ...
    tests = relationship("Test", secondary='TAG_TEST')

class TagTest(Base):
    __tablename__ = u'TAG_TEST'
    tagID = Column(u'TG_TAG_ID', INTEGER(), ForeignKey("TAG.TG_TAG_ID"), primary_key=True, nullable=False)
    testID = Column(u'TS_TEST_ID', INTEGER(), ForeignKey("TEST.TS_TEST_ID"), primary_key=True, nullable=False)
    tagType = Column(u'TG_TYPE', VARCHAR(50), ForeignKey("TAG.TG_TYPE"), primary_key=True, nullable=False)
    ...
    tag = relationship("Tag", backref="testLinks")
    test = relationship("Test", backref="tagLinks")

目前我收到以下错误:

  

ArgumentError:无法确定关系Tag.tests上的父/子表之间的连接条件。指定'primaryjoin'表达式。如果存在'secondary',则还需要'secondaryjoin'。

我错过了什么/做错了什么?

1 个答案:

答案 0 :(得分:1)

我的棘手部分是Tag表的复合外键。这是我的设置:

class TagTest(Base):
    __table_args__ = (ForeignKeyConstraint(['TG_TAG_ID', 'TG_TYPE'],
        ['TAG.TG_TAG_ID', 'TAG.TG_TYPE']), {})
    tagID = Column(u'TG_TAG_ID', INTEGER(), primary_key=True, nullable=False)
    testID = Column(u'TS_TEST_ID', INTEGER(), ForeignKey("TEST.TS_TEST_ID"), primary_key=True, nullable=False)
    tagType = Column(u'TG_TYPE', VARCHAR(50), primary_key=True, nullable=False)
    tag = relationship(Tag, backref="testLinks")
    test = relationship(Test, backref="tagLinks")

class Tag(Base):
    tests = relationship("Test", secondary="TAG_TEST")

然后,为了访问标签所具有的测试,我可以myTag.tests。要访问测试的标记,我可以myTest.tagLinks然后访问.tag属性中每个对象的.tagLinks。不像我想的那样整洁,但它确实有效。