[英]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.