带有过滤器

时间:2018-05-01 13:50:40

标签: python mysql sqlalchemy flask-sqlalchemy

我正在使用PrettyPrinted的Flask-SQLAlchemy教程,并试图找出在查询多对多表环境时如何获得某种行为。

我将在下面提供我正在尝试的查询和SQLAlchemy ORM设置的代码。根据教程(没有进入连接或外连接),有两个主表,一个Channel和一个User表,以及一个名为' subs'的关系表。因此,每个用户都可以订阅'到一个频道,或多个,或没有。

我想弄清楚的是如何查询以便我可以获取Channel中所有行的列表但是过滤掉,或者有一个计算列或额外列来指示特定的行用户ID已订阅'至。因此,只返回所有用户订阅的列的额外列(或列中的空数据)。

以下是我一直在尝试的查询(尝试过其他一些但运气不佳的话):

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

问题在于,它不仅返回Channel中的所有行(我确实希望它这样做),而是当我深入到每一行而不是只有null而不是null时,或者任何只表示选择的用户ID正在订阅它列出了订阅每个频道的所有用户。我能够模仿我尝试做的唯一方法是使用两个查询 - 一个用于所有频道,一个用于所有用户订阅的频道,然后使用理解构建我希望通过单个查询获得的东西。在数据管理方面不是非常pythonic或良好的做法。

有人能指出我做错的方向以及如何修复它吗?非常感谢你!

以下是正在使用的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))

0 个答案:

没有答案