Gorm mengembalikan ralat pengimbas pada jenis rentetan tersuai

王林
Lepaskan: 2024-02-11 18:21:21
ke hadapan
1122 orang telah melayarinya

Gorm 在自定义字符串类型上返回扫描仪错误

pengenalan pisang editor php: Di Gorm, apabila anda cuba melakukan operasi imbasan pada jenis rentetan tersuai, anda mungkin menghadapi ralat. Isu ini boleh menyebabkan pengimbas gagal menghuraikan rentetan dengan betul, mengakibatkan ralat program. Ini kerana Gorm menggunakan kaedah `Imbas` secara lalai untuk mengimbas medan jenis rentetan, tetapi untuk jenis rentetan tersuai, kaedah `Imbas` mungkin tidak mengendalikannya dengan betul. Penyelesaian kepada masalah ini ialah menggunakan kaedah `Nilai` untuk menghuraikan rentetan secara manual untuk memastikan program dijalankan dengan betul. Dengan cara ini anda boleh mengelak daripada menghadapi masalah dengan ralat pengimbas semasa menggunakan Gorm.

Kandungan soalan

Saya menulis entiti berikut:

type datacategory string

const (
    datacategory1 datacategory = "category1"
    datacategory2 datacategory = "category2"
)

type data struct {
    name            string         `json:"name"`
    categories      []datacategory `json:"category" gorm:"type:text[]"`
}
Salin selepas log masuk

Saya mencipta baris secara manual dalam pangkalan data dan mengisi jenis tatasusunan kategori dengan kategori1 dan kategori2.

Tetapi ralat berikut berlaku semasa membaca data:

sql: scan error on column index 19, name "category": unsupported scan, storing driver.value type string into type *[]datacategory
Salin selepas log masuk

Contoh kaedah nilai:

func (s DataCategorySlice) Value() (driver.Value, error) {
    if s == nil {
        return nil, nil
    }
    if len(s) == 0 {
        return "{}", nil
    }

    v := []string{}
    for _, dc := range s {
        v = append(v, string(dc))
    }
    result := fmt.Sprintf("{%s}", strings.Join(v, ","))
    return result, nil
}
Salin selepas log masuk

Penyelesaian

Contoh berikut menganggap anda menggunakan postgresql sebagai rdbms anda dan nilai datacategory tidak mengandungi koma atau petikan tunggal yang tidak dilepaskan.

// declare the custom type
type datacategoryslice []datacategory
Salin selepas log masuk
// implement driver.valuer to encode the value into the
// correct format that is accepted by the target rdbms
func (s datacategoryslice) value() (driver.value, error) {
    if s == nil {
        return nil, nil
    }
    if len(s) == 0 {
        return []byte(`{}`), nil
    }

    v := []byte(`{`)
    for i := range s {
        v = append(v, s[i]...)
        v = append(v, ',')
    }
    v[len(v)-1] = '}' // replace last comma with closing brace
    return v, nil
}
Salin selepas log masuk
// implement scanner to decode the raw source
// value as retrieved from the database
func (s *datacategoryslice) scan(src any) error {
    var data []byte
    switch v := src.(type) {
    case []byte:
        data = v
    case string:
        data = []byte(v)
    case nil:
        return nil
    default:
        return fmt.errorf("unsupported type: %t", src)
    }
    if len(data) == 0 {
        return nil
    }
    data = data[1:len(data)-1] // remove surrounding braces
    for _, v := range bytes.split(data, []byte{','}) {
        *s = append(*s, datacategory(v))
    }
    return nil
}
Salin selepas log masuk

Atau, jika dari value() (driver.value, error) 返回 <code>[]byte 不起作用,例如它会导致 “错误:格式错误的数组文字:<hex 字段值的表示形式> (sqlstate 22p02)”,那么您可以尝试使用 string sebagai jenis pulangan.

Contoh daripada @kozhioyrin

// implement driver.Valuer to encode the value into the
// correct format that is accepted by the target RDBMS
func (s DataCategorySlice) Value() (driver.Value, error) {
    if s == nil {
        return nil, nil
    }
    if len(s) == 0 {
        return "{}", nil
    }

    v := []string{}
    for _, dc := range s {
        v = append(v, string(dc))
    }
    result := fmt.Sprintf("{%s}", strings.Join(v, ","))
    return result, nil
}
Salin selepas log masuk

Atas ialah kandungan terperinci Gorm mengembalikan ralat pengimbas pada jenis rentetan tersuai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!