繁体   English   中英

SQLAlchemy:如何为插入语句设置别名?

[英]SQLAlchemy: How to set alias for insert statement?

需要这样的请求:

    INSERT INTO public.cm_floor as r (load_date, centre, id_floor, name_floor)
        VALUES (now(), 'CentreName', 12345678, 'Floor 2')
        ON CONFLICT ON CONSTRAINT cm_floor_pkey
        DO UPDATE SET load_date=now(), centre=excluded.name_floor=excluded.name_floor
        WHERE (row_to_json(EXCLUDED)::jsonb - 'load_date') IS DISTINCT FROM (row_to_json(r.*)::jsonb - 'load_date');

Python代码:

table = metadata.tables["public.cm_floor"]

records = {
    ...
}

insert_stmt = insert(table).values(records)
do_update_stmt = insert_stmt.on_conflict_do_update(index_elements=primary_keys, set_=update_column,
                                                   where=text("(row_to_json(EXCLUDED)::jsonb - 'load_date') IS DISTINCT FROM (row_to_json(r.*)::jsonb - 'load_date')')"))

我不明白如何设置别名r 或者以不同的方式编写请求。 没有别名。

我对问题的解决方案:

filter = [c != insert_stmt.excluded[c.name] for c in table.c if (not c.primary_key and c.name != "load_date")]

do_update_stmt = insert_stmt.on_conflict_do_update(index_elements=primary_keys, set_=update_column, where=or_(*filter))

最终查询如下所示:

INSERT INTO public.cm_floor (load_date, centre, id_floor, name_floor)
VALUES (now(), 'Centre', 12345678, 'Floor 2')
ON CONFLICT ON CONSTRAINT cm_floor_pkey
DO UPDATE SET load_date=now(), centre=excluded.name_floor=excluded.name_floor
WHERE public.cm_floor.centre<>excluded.centre OR public.cm_floor.name_floor<>excluded.name_floor;

暂无
暂无

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

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