Rumah > Artikel > pembangunan bahagian belakang > Gorm mengembalikan ralat pengimbas pada jenis rentetan tersuai
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.
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[]"` }
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
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 }
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
// 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 }
// 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 }
Atau, jika dari value() (driver.value, error) 返回 <code>[]byte
不起作用,例如它会导致 “错误:格式错误的数组文字:8778596cdf2dd446fb8c439c52c90b59 (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 }
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!