前提・実現したいこと
Flask-SQLAlchemyを用いてアプリケーションを作っています。
queryのfilterをかけて目的の行だけ取得したいのです。
実現したいことはdb.relationship()でつなげたテーブルの値を使って絞り込みをかけるやり方です。
backref側の値を使っての絞り込みは
filter(Master.id=="1")
という書き方で出来るのですが
結合したもう一方のテーブルの値を用いての絞り込み方がわかりません。
該当のソースコード
フィルタ処理を行いたいテーブルの構成は以下のようになっています。
Flask-SqlAlchemy-model
class Master(db.Model): __tablename__ = 'master' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.Text,nullable=True,default=None) serviceA = db.relationship('ServiceA',backref='master',lazy=False,uselist=False) serviceB = db.relationship('ServiceB',backref='master',lazy=False,uselist=False) class ServiceA(db.Model): __tablename__ = 'serviceA' id = db.Column(db.Integer, primary_key=True) master_id = db.Column(db.Integer,db.ForeignKey('master.id'),nullable=False) data = db.Column(db.Text,nullable=True,default=None) class ServiceB(db.Model): __tablename__ = 'serviceB' id = db.Column(db.Integer, primary_key=True) master_id = db.Column(db.Integer,db.ForeignKey('master.id'),nullable=False) data = db.Column(db.Text,nullable=True,default=None)
実現したいことをSQLで書くと以下のようになります。
SQL
1 SELECT 2 master.id AS id, 3 master.name AS name, 4 serviceA.data AS serviceA_data, 5 serviceB.data AS serviceB_data, 6 FROM 7 master_table AS master 8 LEFT OUTER JOIN 9 serviceA AS serviceA 10 ON master.id = serviceA.master_id 11 LEFT OUTER JOIN 12 serviceB AS serviceB 13 ON master.id = serviceB.master_id 14 WHERE 15 serviceA.serviceA_data = "hoge" 16 AND 17 serviceA.serviceB_data = "fuga" 18 ;
試したこと
master = Master.query.filter(Master.ServiceA.data=="hoge").filter(Master.ServiceB.data=="fuga").all()
このような書き方でserviceAのテーブルの値を用いて絞り込みをしてみましたが、出来ませんでした。
まず
master = Master.query.filter(Master.ServiceA.data=="hoge").all()
の段階でうまく動作していません
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/27 05:08
2020/02/27 05:23