SQLAlchemy-如何加入MySQL

SQLAlchemy-如何加入MySQL,mysql,sql,sqlalchemy,flask,flask-sqlalchemy,Mysql,Sql,Sqlalchemy,Flask,Flask Sqlalchemy,我有一个具有以下结构的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

我有一个具有以下结构的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))
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%'
    return db.session.query(Bottom).filter( or_(Bottom.name.like('%query%'),
                                     Bottom.middle.name.like('%query%'),
                                     Bottom.middle.top.name.like('%query%'))
                                     )).all()
以下是我的模型:

**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))
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%'
    return db.session.query(Bottom).filter( or_(Bottom.name.like('%query%'),
                                     Bottom.middle.name.like('%query%'),
                                     Bottom.middle.top.name.like('%query%'))
                                     )).all()
以下是我想要转换为SQLAlchemy的SQL:

**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))
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%'
    return db.session.query(Bottom).filter( or_(Bottom.name.like('%query%'),
                                     Bottom.middle.name.like('%query%'),
                                     Bottom.middle.top.name.like('%query%'))
                                     )).all()
底部的每个条目都与中间的条目相关,而中间的每个条目都与顶部的条目相关。我想查询数据库以查找bottom中的所有条目,其中谁的名字像%query%,以及bottom中谁的中间名字像%query%中的所有条目,以及bottom中谁的中间名字像query中的所有条目

我想将其转换为类似以下内容的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))
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%'
    return db.session.query(Bottom).filter( or_(Bottom.name.like('%query%'),
                                     Bottom.middle.name.like('%query%'),
                                     Bottom.middle.top.name.like('%query%'))
                                     )).all()
换句话说,如果我在底部有一个条目与中间的条目相关,而中间的条目与顶部的条目相关,如果我在顶部搜索合适的名称,它将返回与它相关的中间条目,而不是与它相关的中间条目

以下是一个例子:

数据:

如果我搜索“沃尔特·怀特”,它将不会返回中间关系(杰西·平克曼),而是返回中间关系结果的底层关系(格斯·弗林)

提前感谢:)


执行此查询后,您将只获得Bottom的实例。如果您真的想将这三个元素都作为一个元组(底部、中间、顶部),只需将
query(…)
部分替换为
session.query(底部、中间、顶部)。

具体说明您的问题@曼努拉贾达你不清楚什么?我没有提供哪些细节会有所帮助?@Manurajada我已经更新了一点,不确定现在是否更清楚。我喜欢你回答问题的方式:我为你脱帽致敬。