简体   繁体   English

将原始 PostgreSQL 转换为金字塔应用程序的 SQLAlchemy ORM 查询

[英]Convert raw PostgreSQL into SQLAlchemy ORM query for a Pyramid Application

I have a rather complex SQL query below that I need to convert into an ORM query for our Pyramid application:我在下面有一个相当复杂的 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

For example:例如:

SELECT * from cameras WHERE cameras.camera_groups_uuid == `camera_groups_uuid`;

becomes变成

request.dbsession.query(Camera)
camera_group_cameras = query.filter(Camera.camera_groups_uuid == camera_groups_uuid).all()

I am struggling to perform this type of SQL to ORM conversion for the above SQL我正在努力为上述 SQL 执行这种类型的 SQL 到 ORM 转换

What I have so far is close, but it does not seem to link the tables correctly.到目前为止我所拥有的很接近,但它似乎没有正确链接表格。 It keeps generating a list of tuples.它不断生成一个元组列表。

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()

I got this figured out.我想通了。 The solution turned out to be:解决方案原来是:

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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM