首页 > 解决方案 > Python SQLAlchemy joinload 过滤器参数

问题描述

我正在尝试使用在两个表之间建立左外连接关系,joinedload但它似乎与使用outerjoin方法的行为不同。

这是一个使用示例outerjoin

stmt = select(ServerFarm)
stmt = stmt.outerjoin(
  Server,
  (ServerFarm.name == Server.server_farm_id) & (Server.deleted == False)
)
stmt = stmt.filter(ServerFarm.name == name)

print(stmt)
# SELECT ... FROM server_farm
# LEFT JOIN server ON server_farm.name = server.server_farm_id and server.deleted = False
# WHERE server_farm.name = :name

所以当我使用joinedload它时会发生什么:

stmt = select(ServerFarm)
stmt = stmt.options(
  joinedload(
    ServerFarm.servers,
    (ServerFarm.name == Server.server_farm_id) & (Server.deleted == False)
  )
)
stmt = stmt.filter(ServerFarm.name == name)
# SELECT ... FROM server_farm
# LEFT JOIN server ON server_farm.name = server.server_farm_id
# WHERE server_farm.name = :name

在这种情况下,它只是忽略该(Server.deleted == False)选项。我究竟做错了什么?有没有办法在左外连接上添加“自定义”过滤器joinedload?如何?

标签: pythonsqlalchemy

解决方案


推荐阅读