我有一个具有以下结构的MySQL数据库,希望有人可以帮我将下面的SQL查询转换为SQLAlchemy。
数据库结构:
**bottom:**
id
name
middle_id
**middle:**
id
name
top_id
**top:**
id
name
以下是我的模特:
class Bottom(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
middle_id = db.Column(db.Integer, db.ForeignKey('middle.id'))
middle = db.relationship('Middle',
backref=db.backref('bottoms', lazy='dynamic'))
class Middle(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
top_id = db.Column(db.Integer, db.ForeignKey('top.id'))
top = db.relationship('Top',
backref=db.backref('middles', lazy='dynamic'))
class Top(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
这是我要转换为SQLAlchemy的SQL:
SELECT
b.*,
m.*,
t.*
FROM bottom AS b
LEFT JOIN (SELECT id, name, top_id from middle) AS m on m.id = b.middle_id
LEFT JOIN (SELECT id, name FROM top) AS t on t.id = m.top_id
WHERE b.name LIKE '%query%' OR m.name LIKE '%query%' OR t.name LIKE '%query%'
表底部中的每个条目都与中间相关,中间中的每个条目都与顶部相关>。我想查询数据库以查找底部中名称为LIKE%query%的所有条目,以及底部中的所有条目的条目,其中间名称为LIKE%query %,以及底部中所有顶部名称的所有条目的条目都是LIKE 查询。
我想将它转换为SQLAlchemy,如下所示:
return db.session.query(Bottom).filter( or_(Bottom.name.like('%query%'),
Bottom.middle.name.like('%query%'),
Bottom.middle.top.name.like('%query%'))
)).all()
换句话说,如果我在Bottom中有一个与Middle中的条目相关的条目,并且Middle中的条目与Top中的条目相关,如果我在Top中搜索相应的名称,它将返回而不是与之相关的中间条目,但是与相关中间条目相关的Bottom条目。
以下是一个例子:
数据:
**bottom**
id 1
name "Gus Fring"
middle_id 1
**middle**
id 1
name "Jesse Pinkman"
top_id 1
**top**
id 1
name "Walter White"
如果我搜索“Walter White”,它将不会返回中间关系(Jesse Pinkman),而是返回中间关系结果(Gus Fring)的底部关系。
提前谢谢你:)。
答案 0 :(得分:1)
name_filter = '%query%'
qry = (session.query(Bottom).
outerjoin(Middle).
outerjoin(Top).
filter(or_(
Bottom.name.like(name_filter),
Middle.name.like(name_filter),
Top.name.like(name_filter),
))
)
由于此查询执行,您将只获得Bottom的实例。如果你真的想要所有3个作为元组(Bottom,Middle,Top),只需将query(...)
部分替换为session.query(Bottom, Middle, Top).