烧瓶中的多对多过滤器

时间:2021-04-13 14:40:58

标签: python-3.x flask sqlalchemy flask-sqlalchemy

使用 SQLAlchemy 1.3.23、Flask-SQLAlchemy Flask-SQLAlchemy 和 PostgreSQL 13.2,我有一个多对多的关系:

class PositionsModel(db.Model):

  __tablename__ = "positions"

  id = db.Column(db.Integer, primary_key=True)
  position_name = db.Column(db.String(150), nullable=False)

  types_of_work = db.relationship(
    "TypesOfWorkModel",
    secondary=positions_types_of_work,
    lazy="joined",
    backref=db.backref("type_positions", lazy="noload")
  )

class TypesOfWorkModel(db.Model):

  __tablename__ = "types_of_work"

  id = db.Column(db.Integer, primary_key=True)
  work_type_name = db.Column(db.String(150), nullable=False)


positions_types_of_work = db.Table(
  "positions_types_of_work",
  db.Column("position_id", db.Integer, db.ForeignKey("positions.id"), primary_key=True),
  db.Column("type_of_work_id", db.Integer, 
            db.ForeignKey("types_of_work.id"), primary_key=True)
)

其中 positions_types_of_work 是从“positions”中查找“type_of_work”的第三个表.

我需要能够通过 type_of_work 过滤数据,所以我最终得到了这个查询:

data = PositionsModel.query
data = data.join(positions_types_of_work).join(TypesOfWorkModel).filter(
  TypesOfWorkModel.id.in_(kwargs["types_of_work"])
)

return data.paginate(10, 25, False).items

一切正常,但是我注意到生成的 SQL 很奇怪:

SELECT
    positions.id AS positions_id,
    positions.position_name AS positions_position_name,
    types_of_work_1.id AS types_of_work_1_id,
    types_of_work_1.work_type_name AS types_of_work_1_work_type_name
FROM positions

JOIN positions_types_of_work ON positions.id = positions_types_of_work.position_id
JOIN types_of_work ON types_of_work.id = positions_types_of_work.type_of_work_id
LEFT OUTER JOIN (
    positions_types_of_work AS positions_types_of_work_1
    JOIN types_of_work AS types_of_work_1 ON types_of_work_1.id = positions_types_of_work_1.type_of_work_id
) ON positions.id = positions_types_of_work_1.position_id
WHERE types_of_work.id IN (%(id_1)s, %(id_2)s)

我确实期待前两个 JOIN,但我不明白为什么我有 LEFT OUTER JOIN?也许最终我运行了错误的flask-sqlalchemy 查询,应该以某种方式对其进行更改?

0 个答案:

没有答案