【发布时间】:2020-03-09 20:02:29
【问题描述】:
下面有一个相当复杂的 SQL 查询,我需要将其转换为我们的 Pyramid 应用程序的 ORM 查询:
SELECT cameras. *, b.url
FROM cameras
LEFT OUTER JOIN camera_url_sets ON cameras.uuid = camera_url_sets.camera_uuid
LEFT JOIN(SELECT url_set_uuid, url
FROM urls
WHERE url_type_id = 3) as b ON camera_url_sets.url_set_uuid = b.url_set_uuid
例如:
SELECT * from cameras WHERE cameras.camera_groups_uuid == `camera_groups_uuid`;
变成
request.dbsession.query(Camera)
camera_group_cameras = query.filter(Camera.camera_groups_uuid == camera_groups_uuid).all()
我正在努力为上述 SQL 执行这种类型的 SQL 到 ORM 的转换
到目前为止,我所拥有的很接近,但它似乎没有正确链接表格。它不断生成一个元组列表。
url_subquery = request.dbsession.query(Url).filter(Url.url_type_id == 3, Url.enabled == True).subquery()
cameras = request.dbsession.query(Camera, Url.url)\
.outerjoin(Camera_Url_Sets, Camera.uuid == Camera_Url_Sets.camera_uuid)\
.outerjoin(url_subquery, Camera_Url_Sets.url_set_uuid == url_subquery.c.url_set_uuid)\
.filter(Camera.camera_groups_uuid == camera_groups_uuid).all()
【问题讨论】:
-
试试这些stackoverflow.com/search?q=%5Bsqlalchemy%5D+left+join+subquery,它们至少应该让您了解如何在 SQLA 中创建查询。
-
我想出了这个:
url_subquery = request.dbsession.query(Url).filter(Url.url_type_id == 3).subquery() cameras = request.dbsession.query(Camera, url_subquery.c.url).outerjoin(Camera_Url_Sets, Camera.uuid == Camera_Url_Sets.camera_uuid).join(url_subquery, Camera_Url_Sets.url_set_uuid == url_subquery.c.url_set_uuid) camera_group_cameras = cameras.filter(Camera.camera_groups_uuid == camera_groups_uuid).all()这是我能得到的最接近的结果 -
能否请您编辑您的问题以包括您的尝试,如果是这样的话,可能还有一两个字关于它如何尚未按预期工作。
-
刚刚添加了我所拥有的最接近的东西。
-
您应该编辑您的问题以包括您的模型、当前尝试的结果和您期望的结果。
标签: python sql sqlalchemy pyramid