From 857adaaf867df54d4a023cf19f618fdf1d0f60c9 Mon Sep 17 00:00:00 2001 From: Gord Thompson Date: Sat, 13 Feb 2021 14:43:21 -0700 Subject: Accept ColumnCollection in update_on_conflict(set_= Fixes: #5939 Change-Id: I21d7125765028e2a98d5ef4c32d8e7e457aa2d12 --- lib/sqlalchemy/dialects/postgresql/dml.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'lib/sqlalchemy/dialects/postgresql/dml.py') diff --git a/lib/sqlalchemy/dialects/postgresql/dml.py b/lib/sqlalchemy/dialects/postgresql/dml.py index bff61e173..b6f5cdf7e 100644 --- a/lib/sqlalchemy/dialects/postgresql/dml.py +++ b/lib/sqlalchemy/dialects/postgresql/dml.py @@ -12,6 +12,7 @@ from ...sql import roles from ...sql import schema from ...sql.base import _exclusive_against from ...sql.base import _generative +from ...sql.base import ColumnCollection from ...sql.dml import Insert as StandardInsert from ...sql.elements import ClauseElement from ...sql.expression import alias @@ -243,8 +244,17 @@ class OnConflictDoUpdate(OnConflictClause): "but not both, must be specified unless DO NOTHING" ) - if not isinstance(set_, dict) or not set_: - raise ValueError("set parameter must be a non-empty dictionary") + if isinstance(set_, dict): + if not set_: + raise ValueError("set parameter dictionary must not be empty") + elif isinstance(set_, ColumnCollection): + set_ = dict(set_) + else: + raise ValueError( + "set parameter must be a non-empty dictionary " + "or a ColumnCollection such as the `.c.` collection " + "of a Table object" + ) self.update_values_to_set = [ (coercions.expect(roles.DMLColumnRole, key), value) for key, value in set_.items() -- cgit v1.2.1