我正在努力让很多人加入到使用SQLAlchemy中的模型工作。我在网上找到了很多例子,但我似乎无法弄清楚他们的字符串是否代表他们喜欢的列名与数据库表实际拥有的列名,或者他们使用的是Table
而不是声明性模型,或其他不同的东西,他们的例子不起作用。我目前有以下设置:
我有以下型号:
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'。
我错过了什么/做错了什么?
答案 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
。不像我想的那样整洁,但它确实有效。