Express SQL Join和多对多过滤器采用SQLAlchemy格式



我试图学习SQLAlchemy的最佳实践:a(做我需要的事情,b(以最有效的方式做。

我目前有3个表,定义了clubperson之间的多对多关系。

class Club(db.Model)
__tablename__ = 'club'
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.String)
class Person(db.Model)
__tablename__ = 'person'
id = db.Column(db.Integer, primary_key=True)
club_person_assoc = Table('club_person_ass', db.Model.metadata,
Column('club_id', db.Integer, db.ForeignKey('club.id')),
Column('person_id', db.Integer, db.ForeignKey('person.id'))
)

返回的好方法是什么:特定person(person.id==1)所属的所有clubs,条件是俱乐部类型(club.type='sports')

在SQL中,我可以直接将语句表示为:

SELECT *
FROM (
SELECT *
FROM club
WHERE club.type = 'sports'
) AS lef
INNER JOIN (
SELECT *
FROM club_person_assoc
WHERE club_person_assoc.person_id = 1
) AS rig
ON lef.id = rig.club_id;

我可以通过以下操作来使用python列表理解来伪造它:

class Person(db.Model)
...
clubs = db.relationship('Club', secondary=club_person_assoc)
# later using list comprehension
filtered = [club for club in person_x.clubs if club.type == 'sports']

但是上面的内容当然感觉是人为的,而且比原生DB查询慢。

如果除了文档之外,你还有什么关于学习这些东西的好地方的建议,在更教程的风格中,我会很感激你的评论。

我没有教程建议,但进行列表理解与以最有效的方式进行列表理解完全相反。

这样做的方式类似于:

Session().query(Club.Id).join(Person).filter(Club.type == "sports").filter(Person.id == 1).all()

相关内容

  • 没有找到相关文章

最新更新