2017-09-03 5 views
2

sqlalchemyを使用してクエリを作成していますが、これは実行されていないと思っています。データベース/ ormを使用する方法ではありません。sqlalchemyとの結合関係をフィルタリングする

これは私のスキーマの簡易版である:

class User(Base): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(64), unique=True, index=True) 
    longs = db.relationship('Login', backref='users') 

class Login(Base): 
    __tablename__ = 'logins' 
    id = db.Column(db.Integer, primary_key=True) 
    user_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    browser = db.Column(db.String(64) 

私はAを参照するBの行数があることを考えると状態、などのすべての要素のために、持っていると思います Aは、ユーザー Bのリストには、ログインのリストです:

一定数未満、のは、このことを想像し、実際のケース5.

をしましょう

Firefoxで5回未満ログインしたすべてのユーザーのリストを取得したいと思います。ログインしていないユーザーも含まれます!

SQL/SQLAlchemyのでは、私はこの方法でこれを行うだろう:

1)選択行を、すべての

never_loggedin = session.query(User).join(Login, 
Logins.user_id == User.id).\ 
     filter(Login.user_id == None) 

2)選択のログインでログインしていないこと、左結合を使用してFirefoxの場合は、5未満の数を取るだけです。

sub_query = session.query(Login).filter(Login.browser == 
browser).subquery() 
less_ex = session.query(User).outerjoin(sub_query, 
sub_query.c.user_id == 
User.id).group_by(sub_query.c.user_id).having(func.count(User.id) < 
repetition) 

3)今問題があります。ログインしたユーザーはFirefoxでは絶対に使用されないかもしれませんが、それらは前のクエリから選択されていない可能性があります。私はそれらを選ぶ方法を知らない。

私は正しく進めていますか?具体的には、多対多の関係を使用する必要があったはずですが、ソフトウェアの次の要素を追加してこの編集を行うつもりです。

+0

ハム..おそらく選択と「選択しない」選択が解決策になるかもしれません... – asdf

答えて

1
sub_query = session.query(Login.user_id).filter(Login.browser == browser).group_by(Login.user_id).having(func.count(Login.id) >= repetition).subquery() 
    less = session.query(User).filter(~User.id.in_(sub_query)) 
関連する問題