我正在使用 2 个模型。
class Foo(db.Model):
id = db.Column(db.Integer, primary_key=True)
desc = db.Column(db.String(30))
bars = db.relationship('Bar', back_populates='foo')
class Bar(db.Model):
key_1 = db.Column(db.String('64'), primary_key=True)
key_2 = db.Column(db.String('64'), primary_key=True)
up_foo = db.Column(db.String('64'), primary_key=True)
foo_id = Column(Integer, ForeignKey('foo.id'))
foo = relationship('Foo', back_populates='bars')
我想做的是加入Foo
和Bar
,但在场上up_foo
从Bar
表。我的查询看起来像
select * from foo f
inner join bar b on f.id = b.up_foo
但似乎无论我以哪种方式配置关系,我都会收到 2 个错误之一。首先是 SQLAlchemy 找不到任何相关的外键列。第二个是我无法映射列up_foo
两次,因为它已经是主键,因此也无法将其映射为外键。
我怎样才能做到这一点?
您绝对可以指示其中一列既是复合primary key
的一部分,也是foreign_key
。当然,它还要求这些列属于同一类型。下面的代码应该可以正常工作:
class Foo(db.Model):
id = db.Column(db.Integer, primary_key=True)
desc = db.Column(db.String(30))
bars = db.relationship('Bar', back_populates='foo')
class Bar(db.Model):
key_1 = db.Column(db.String(64), primary_key=True)
key_2 = db.Column(db.String(64), primary_key=True)
up_foo = db.Column(db.Integer, db.ForeignKey('foo.id'), primary_key=True)
foo = db.relationship('Foo', back_populates='bars')
在这种情况下,您的查询非常简单,因为您甚至不需要指定连接条件:
q = db.session.query(Foo, Bar).join(Bar)