bun icon indicating copy to clipboard operation
bun copied to clipboard

Bulk update with uuid

Open fabl3ss opened this issue 2 years ago • 3 comments

Hi!

When attempting to perform a bulk update on my entities, I encountered an error from PostgreSQL. I would appreciate any guidance or suggestions on how to resolve this issue.

The specific error message I'm encountering is:

ERROR:  operator does not exist: uuid = bytea at character 738
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

DDL:

create table refunds
(
    transaction_id uuid                  not null
        primary key,
    order_id       uuid                  not null,
    created_at     timestamp             not null,
    is_notified    boolean default false not null
);

Struct:

import (
	"github.com/google/uuid"
	// some more imports
)

type Refund struct {
	bun.BaseModel `bun:"table:notification.refunds"`

	TransactionId uuid.UUID `bun:",pk"`
	OrderId       uuid.UUID
	IsNotified    bool
	CreatedAt     time.Time
}

Usage:

func (r *RefundRepository) UpdateBulk(ctx context.Context, refunds []*notification_model.Refund) error {
	_, err := r.db.NewUpdate().
		Model(&refunds).
		Bulk().
		Exec(ctx)

	return errors.WithStack(err)
}

Resulting SQL query:

WITH "_data" ("transaction_id",
              "order_id",
              "is_notified",
              "created_at") AS (
                                VALUES ('9bc92b7c-f273-46a4-b21f-47e28d514eb2'::BYTEA,
                                        'bcdc23bc-87ac-4e5a-932c-2dd27eb46794'::BYTEA,
                                        TRUE::BOOLEAN,
                                        '2006-01-02 15:04:05+00:00'::TIMESTAMPTZ), ('3c845e12-6286-43c5-8e92-5a3ec43a4734'::BYTEA,
                                                                                    'c5d817a6-8352-4948-b8b0-7937c5f6ec03'::BYTEA,
                                                                                    TRUE::BOOLEAN,
                                                                                    '2006-01-02 15:05:05+00:00'::TIMESTAMPTZ), ('b23c4111-8550-4768-bd69-6d857a0ee30b'::BYTEA,
                                                                                                                                '2352cdc0-c92a-4c3c-a3bc-94b00adda01e'::BYTEA,
                                                                                                                                TRUE::BOOLEAN,
                                                                                                                                '2006-01-02 15:06:05+00:00'::TIMESTAMPTZ))
UPDATE "notification"."refunds" AS "refund"
SET "order_id" = _data."order_id",
    "is_notified" = _data."is_notified",
    "created_at" = _data."created_at"
FROM _data
WHERE ("refund"."transaction_id" = _data."transaction_id")

fabl3ss avatar Sep 25 '23 16:09 fabl3ss

Can confirm this issue exists. Following snippet from docs generated SQL query with the UUID fields as '3189cd28-d404-4b9c-87c6-9a4d6577959d'::BYTEA.

mogita avatar Apr 11 '24 11:04 mogita