Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk memasukkan struct Go dengan medan JSON bersarang ke dalam pangkalan data PostgreSQL menggunakan sqlx?

Bagaimana untuk memasukkan struct Go dengan medan JSON bersarang ke dalam pangkalan data PostgreSQL menggunakan sqlx?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 09:11:02773semak imbas

How to insert Go structs with nested JSON fields into PostgreSQL databases using sqlx?

Memasukkan Struct dalam Pangkalan Data PostgreSQL

Latar Belakang

Apabila menggunakan Go lang dengan PostgreSQL sebagai pangkalan data, "github.com/lib/pq " pemacu membolehkan sambungan pangkalan data. Walau bagaimanapun, memasukkan data secara manual daripada struct kompleks dengan medan JSON bersarang ke dalam pangkalan data boleh membosankan kerana bilangan medan dan nilai yang banyak.

Menggunakan Parameter Dinamakan dengan sqlx

Nasib baik, github. Perpustakaan com/jmoiron/sqlx menyediakan penyelesaian dengan fungsi NamedExecnya. Fungsi ini membolehkan anda menghantar struct dengan nama medan beranotasi (menggunakan teg db) sebagai parameter bernama, memudahkan proses pemasukan.

Contoh Pelaksanaan

Pertimbangkan struct berikut:

<code class="go">type ApplyLeave1 struct {
    LeaveId           int       `db:"leaveid"`
    EmpId             string    `db:"empid"`
    SupervisorEmpId   string    `db:"supervisorid"`
}</code>

Untuk memasukkan struct ini ke dalam jadual pangkalan data, anda boleh menggunakan kod berikut:

<code class="go">import (
    _ "github.com/lib/pq"
    "github.com/jmoiron/sqlx"
    "log"
)

// Define the database connection.
db, err := sqlx.Connect("postgres", "user=foo dbname=bar sslmode=disable")
if err != nil {
    log.Fatalln(err)
}

// Prepare the SQL query with named parameters.
query := `INSERT INTO TABLENAME(leaveid, empid, supervisorid) 
          VALUES(:leaveid, :empid, :supervisorid)`

// Create an instance of the struct to be inserted.
var leave1 ApplyLeave1

// Execute the query with the named parameters.
_, err = db.NamedExec(query, leave1)
if err != nil {
    log.Fatalln(err)
}</code>

Pendekatan ini memudahkan proses pemasukan dengan ketara, menghapuskan keperluan untuk menentukan setiap medan dan nilai secara manual.

Memasukkan Tatasusunan JSON

Walaupun perpustakaan sqlx tidak menyokong pemasukan tatasusunan JSON secara langsung, anda boleh menggunakan jenis data jsonb PostgreSQL untuk menyimpan data JSON. Untuk memasukkan tatasusunan JSON ke dalam lajur jsonb, anda boleh menukarnya terlebih dahulu menjadi rentetan dan kemudian gunakan pembina pertanyaan sqlx untuk memasukkannya.

Sebagai contoh, diberikan struct berikut dengan medan tatasusunan JSON:

<code class="go">type ApplyLeave1 struct {
    LeaveId           int       `db:"leaveid"`
    EmpId             string    `db:"empid"`
    SupervisorEmpId   string    `db:"supervisorid"`
    Certificates     []CertificateInfo `db:"certificates"`
}</code>

Anda boleh memasukkannya ke dalam pangkalan data PostgreSQL menggunakan kod berikut:

<code class="go">// Convert the JSON array to a string.
certificatesJSON, err := json.Marshal(leave1.Certificates)
if err != nil {
    log.Fatalln(err)
}

// Prepare the SQL query with named parameters.
query := `INSERT INTO TABLENAME(leaveid, empid, supervisorid, certificates) 
          VALUES(:leaveid, :empid, :supervisorid, :certificates)`

// Create an instance of the struct to be inserted.
var leave1 ApplyLeave1

// Execute the query with the named parameters.
_, err = db.NamedExec(query, map[string]interface{}{
    "leaveid":      leave1.LeaveId,
    "empid":        leave1.EmpId,
    "supervisorid": leave1.SupervisorEmpId,
    "certificates": string(certificatesJSON),
})
if err != nil {
    log.Fatalln(err)
}</code>

Pendekatan ini membolehkan anda memasukkan struct kompleks dengan tatasusunan JSON ke dalam pangkalan data PostgreSQL menggunakan kaedah yang mudah dan cekap.

Atas ialah kandungan terperinci Bagaimana untuk memasukkan struct Go dengan medan JSON bersarang ke dalam pangkalan data PostgreSQL menggunakan sqlx?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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