From 8af50437c2dca516df79373e4f866ede2dc7256f Mon Sep 17 00:00:00 2001 From: zodal Date: Wed, 29 Jul 2020 16:17:18 +0800 Subject: [PATCH] allow pg upsert specify conflict target column --- .../me/liuwj/ktorm/support/postgresql/InsertOrUpdate.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ktorm-support-postgresql/src/main/kotlin/me/liuwj/ktorm/support/postgresql/InsertOrUpdate.kt b/ktorm-support-postgresql/src/main/kotlin/me/liuwj/ktorm/support/postgresql/InsertOrUpdate.kt index 12a3cb9e..a0547f82 100644 --- a/ktorm-support-postgresql/src/main/kotlin/me/liuwj/ktorm/support/postgresql/InsertOrUpdate.kt +++ b/ktorm-support-postgresql/src/main/kotlin/me/liuwj/ktorm/support/postgresql/InsertOrUpdate.kt @@ -24,6 +24,7 @@ import me.liuwj.ktorm.expression.ColumnExpression import me.liuwj.ktorm.expression.SqlExpression import me.liuwj.ktorm.expression.TableExpression import me.liuwj.ktorm.schema.BaseTable +import me.liuwj.ktorm.schema.Column /** * Insert or update expression, represents an insert statement with an @@ -87,7 +88,8 @@ fun > Database.insertOrUpdate(table: T, block: InsertOrUpdateSt val expression = InsertOrUpdateExpression( table = table.asExpression(), assignments = assignments, - conflictTarget = primaryKeys.map { it.asExpression() }, + conflictTarget = builder.conflictColumns.map { it.asExpression() }.takeIf { it.isNotEmpty() } + ?: primaryKeys.map { it.asExpression() }, updateAssignments = builder.updateAssignments ) @@ -103,11 +105,13 @@ class InsertOrUpdateStatementBuilder( ) : AssignmentsBuilder(assignments) { internal val updateAssignments = ArrayList>() + internal val conflictColumns = ArrayList>() /** * Specify the update assignments while any key conflict exists. */ - fun onDuplicateKey(block: AssignmentsBuilder.() -> Unit) { + fun onDuplicateKey(vararg columns: Column<*>, block: AssignmentsBuilder.() -> Unit) { + conflictColumns += columns val assignments = ArrayList>() AssignmentsBuilder(assignments).apply(block) updateAssignments += assignments