【问题标题】:Convert raw PostgreSQL into SQLAlchemy ORM query for a Pyramid Application将原始 PostgreSQL 转换为 Pyramid 应用程序的 SQLAlchemy ORM 查询
【发布时间】: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


【解决方案1】:

我想通了。解决方案原来是:

url_subquery = request.dbsession.query(Url).filter(Url.url_type_id == 3, Url.enabled == True, Url.verified == True).subquery()
cameras = request.dbsession.query(Camera, url_subquery.c.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)
if request.params.get('guardbox'):
    camera_group_cameras = cameras.filter(Camera.camera_groups_uuid == camera_groups_uuid, Camera.magic_camera_box == guardbox).order_by(asc(Camera.name)).all()
else:
    camera_group_cameras = cameras.filter(Camera.camera_groups_uuid == camera_groups_uuid).order_by(asc(Camera.name)).all()

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2015-08-23
    • 2020-07-13
    • 2019-12-10
    相关资源
    最近更新 更多