sqlalchemy带过滤器的多对多外部连接

fruv7luv  于 2021-06-21  发布在  Mysql
关注(0)|答案(0)|浏览(163)

我正在使用prettyprinted的flask-sqlalchemy教程,并试图找出如何在查询多对多表环境时获得特定行为。
我将在下面包括我一直在尝试的查询和sqlalchemy orm设置的代码。根据教程(不涉及连接或外部连接),有两个主表,一个通道和一个用户表,以及一个名为“subs”的关系表。所以每个用户都可以“订阅”一个频道,或者多个频道,或者没有。
我想弄清楚的是如何进行查询,这样我就可以得到通道中所有行的列表,但要进行筛选,或者有一个计算列或额外的列来指示特定用户id“订阅”的那些行。因此,所有的数据都将被返回,只是为所选用户订阅的数据返回一个额外的列(或者不是列中的空数据)。
以下是我一直在尝试的问题(尝试了其他一些问题,但运气更差):

chan_query = Channel.query.outerjoin(User, User.user_id==1).all()

问题是,它不仅返回channel中的所有行(我确实希望它这样做),而且当我深入到每一行而不是只有一个null和not null,或者任何表示只订阅所选用户id的内容时,它会列出订阅到每个通道的所有用户。我唯一能够模仿我正在尝试做的事情的方法是使用两个查询—一个用于所有频道,一个用于用户订阅的所有频道,然后使用理解来构建我希望通过一个查询得到的内容。在数据管理方面不是很好的做法。
有人能告诉我我做错了什么,以及如何去改正吗?非常感谢!
下面是正在使用的orm表的代码:

subs = db.Table('subs',
    db.Column('user_id', db.Integer, db.ForeignKey('user.user_id')),
    db.Column('channel_id', db.Integer, db.ForeignKey('channel.channel_id'))
)

class User(db.Model):
    user_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))
    subscriptions = db.relationship('Channel', secondary=subs, backref=db.backref('subscribers', lazy='dynamic'))

class Channel(db.Model):
    channel_id = db.Column(db.Integer, primary_key=True)
    channel_name = db.Column(db.String(20))

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题