【问题标题】:SQLAlchemy - How to MySQL JOINSQLAlchemy - 如何连接 MySQL
【发布时间】:2012-07-02 07:43:24
【问题描述】:

我有一个具有以下结构的 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%'

bottom表中的每一项都与middle相关,middle表中的每一项都与top相关>。我想查询数据库以查找 bottom 中名为 LIKE %query% 的所有条目,以及 bottom 中名为 LIKE %query 的所有条目的条目%,以及 bottom 中所有条目的条目,其中中间顶部的名称为 LIKE query

我想把它转换成这样的 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**
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)。

提前谢谢你:)。

【问题讨论】:

标签: mysql sql sqlalchemy flask flask-sqlalchemy


【解决方案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 个作为元组(底部、中间、顶部),只需将 query(...) 部分替换为 session.query(Bottom, Middle, Top).

【讨论】:

  • 我喜欢你回答问题的方式:我为你摘帽。
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2020-01-24
  • 2018-06-21
  • 1970-01-01
  • 2019-12-28
  • 2015-11-17
相关资源
最近更新 更多