drizzle-orm icon indicating copy to clipboard operation
drizzle-orm copied to clipboard

[FEATURE]: Support multiple onConflictDoUpdate's

Open mw10013 opened this issue 1 year ago • 0 comments

Describe what you want

When an insert has multiple onConflictDoUpdate's, it seems that only the last one is picked up when executed. Ask for multiple on conflict clauses per https://www.sqlite.org/syntax/upsert-clause.html

    const [subscription] = await db
      .insert(schema.subscriptions)
      .values({
        id: subscriptionData.id,
        status: subscriptionData.status,
        plan,
        cycleStartedAt,
        customerId: subscriptionData.customerId,
        createdAt,
        updatedAt,
      })
      .onConflictDoUpdate({
        target: schema.subscriptions.id,
        set: {
          status: subscriptionData.status,
          plan,
          cycleStartedAt,
          updatedAt,
        },
        setWhere: sql`${updatedAt.getTime()} > ${schema.subscriptions.updatedAt}`,
      })
      .onConflictDoUpdate({
        target: schema.subscriptions.customerId,
        set: {
          id: subscriptionData.id,
          status: subscriptionData.status,
          plan,
          cycleStartedAt,
          createdAt,
          updatedAt,
        },
        setWhere: sql`${createdAt.getTime()} > ${schema.subscriptions.createdAt}`,
      })
      .returning();

insert into "subscriptions" ("id", "status", "plan", "cycle_started_at", "customer_id", "created_at", "updated_at") 
values (?, ?, ?, ?, ?, ?, ?) 
on conflict ("subscriptions"."customer_id") 
do update set "id" = ?, "status" = ?, "plan" = ?, "cycle_started_at" = ?, "created_at" = ?, "updated_at" = ? 
where ? > "subscriptions"."created_at" returning "id", "status", "plan", "cycle_started_at", "customer_id", "created_at", "updated_at" 

mw10013 avatar May 08 '24 15:05 mw10013