Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Laksanakan antara muka pangkalan data/sql.Scanner

Laksanakan antara muka pangkalan data/sql.Scanner

王林
王林ke hadapan
2024-02-10 13:30:08575semak imbas

Laksanakan antara muka pangkalan data/sql.Scanner

editor php Yuzai akan memperkenalkan kepada anda cara melaksanakan antara muka pangkalan data/sql.Scanner dalam artikel ini. Dalam bahasa Go, pakej pangkalan data/sql ialah pakej teras untuk mengendalikan pangkalan data hubungan. Antara muka Pengimbas digunakan untuk mengimbas nilai dalam hasil pertanyaan pangkalan data ke dalam pembolehubah bahasa Go. Dengan melaksanakan antara muka Pengimbas, kami boleh menyesuaikan penukaran nilai dalam hasil pertanyaan pangkalan data ke dalam jenis yang kami mahu. Artikel ini akan menerangkan secara terperinci cara melaksanakan antara muka Pengimbas untuk membantu pembaca lebih memahami dan menggunakan operasi pangkalan data dalam bahasa Go.

Kandungan soalan

Bagaimana untuk melaksanakan database/sql.Scannerantara muka?

Dalam pertanyaan ini, terdapat 3 medan dalam klausa PILIH:

  • idkecil tak bertanda
  • is_suspended tinyint unsigned
  • name varchar

Dalam database/sql, jenis data 3 lajur ialah:

  • int64
  • int64
  • []uint8

Ini berfungsi untuk []antara muka{}, tetapi ingin melaksanakan setiap jenis lajur terus ke dalam antara muka []接口{},但希望将每个列类型直接实现到 database/sql.Scanner

cols    := make([]interface{}, 3)
ptr     := make([]interface{}, 3)

for i, _ := range cols {
    ptr[i] = &cols[i]
}

if err := rows.Scan(ptr...); err != nil {
    fmt.Println("err:", err)
}

// pair column data with column name
res := map[string]any
for i, name := range res_cols {
    res[name] = *ptr[i].(*any)
    
    fmt.Printf("Type: %T %s\n", res[name], name)
}

Perkara yang saya cuba lakukan tetapi tidak benar-benar berjaya

Taip

type Type_int int

func (t *Type_int) Scan(value interface{}) error {
    switch value := value.(type) {
    case int64:
        *t = Type_int(value)
    default:
        return fmt.Errorf("Invalid database type: %T %v", value, value)
    }
    return nil
}

type Type_string string

func (t *Type_string) Scan(value interface{}) error {
    switch value := value.(type) {
    case []uint8:
        *t = Type_string(value)
    default:
        return fmt.Errorf("Invalid database type: %T %v", value, value)
    }
    return nil
}

Kod

ptr     := make([]interface{}, 3)

cols    := []interface{}{
    Type_int,
    Type_int,
    Type_string,
}

for i, _ := range cols {
    ptr[i] = &cols[i]
}

if err := rows.Scan(ptr...); err != nil {
    fmt.Println("err:", err)
}

// pair column data with column name
res := map[string]any
for i, name := range res_cols {
    res[name] = *ptr[i].(*any)
    
    fmt.Printf("Type: %T %s\n", res[name], name)
}

Penyelesaian

Mulakan ptr dengan penunjuk kepada nilai jenis yang diberikan.

var c1 Type_int
var c2 Type_int
var c3 Type_string
ptr := []any{&c1, &c2, &c3}
if err := rows.Scan(ptr...); err != nil {
    fmt.Println("err:", err)
}

ptr Slice tidak memberikan sebarang nilai dalam coretan di atas. Kod boleh dipermudahkan kepada:

var c1 Type_int
var c2 Type_int
var c3 Type_string
if err := rows.Scan(&c1, &c2, &c3); err != nil {
    fmt.Println("err:", err)
}

Atas ialah kandungan terperinci Laksanakan antara muka pangkalan data/sql.Scanner. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam