Rumah > pembangunan bahagian belakang > Golang > golang gorm kemas kini dan kembali

golang gorm kemas kini dan kembali

PHPz
Lepaskan: 2024-02-05 22:06:12
ke hadapan
576 orang telah melayarinya

golang gorm 更新并返回

Kandungan soalan

Dalam projek golang saya, saya menggunakan gorm dan saya perlu membuat pertanyaan upsert menggunakan klausa pulangan untuk mendapatkan nilai yang diubah suai daripada pertanyaan. Saya boleh melakukan upsert, tetapi saya tidak tahu bagaimana untuk menyambung klausa pulangan kepadanya. Nama jadual ialah pembilang, dan kodnya adalah seperti berikut:

te := struct {
        name string //key column
        counter int
    }{
        name: "name_to_update",
        counter: 2,
    }

db.
    //model(te).
    clauses(
        //clause.returning{columns: []clause.column{{name: "counter"}}},
        clause.onconflict{
            columns: []clause.column{{name: "name"}}, // key column
            doupdates: clause.assignments(map[string]interface{}{
                "counter": gorm.expr("counters.counter + ?", 1),
            }),
        },
    ).create(&te)
Salin selepas log masuk

Pertanyaan sql yang dihasilkan ialah:

INSERT INTO "counters" ("counter", "name") VALUES (0, "name_to_update") ON CONFLICT ("name") 
DO UPDATE SET "counter"=counters.counter + 1 RETURNING "name" //I need updated counter value here, not name
Salin selepas log masuk

Jadi kaunter dikemas kini, yang tidak ada masalah, tetapi apabila saya memerlukan nilai kemas kini kaunter, ia mengembalikan lajur kunci (dalam pemulangan). Sebarang idea bagaimana untuk membetulkannya? Terima kasih


Jawapan betul


Saya tidak pasti sama ada struktur tanpa nama menyebabkan masalah.

Selain itu, kod anda tidak jelas dari mana nama jadual - "kaunter" - berasal.

Saya telah mencuba penyelesaian anda - tetapi menggunakan struktur khusus untuk model - dan ia berfungsi dengan baik.

type counter struct {
    name    string `gorm:"primarykey"`
    counter int
}

...

counter := counter{name: "name_to_update", counter: 2}

    db.
        clauses(
            clause.returning{columns: []clause.column{{name: "counter"}}},
            clause.onconflict{
                columns: []clause.column{{name: "name"}},
                doupdates: clause.assignments(map[string]interface{}{
                    "counter": gorm.expr("counters.counter + ?", 1),
                }),
            },
        ).create(&counter)

    fmt.println(counter.counter)
Salin selepas log masuk

Kod di atas menjana sql berikut

INSERT INTO "counters" ("name","counter") VALUES ('name_to_update',10) ON CONFLICT ("name") DO UPDATE SET "counter"=counters.counter + 1 RETURNING "counter"
Salin selepas log masuk

dan counter.counter mempunyai nilai kemas kini yang betul.

Atas ialah kandungan terperinci golang gorm kemas kini dan kembali. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan