>백엔드 개발 >Golang >GORM 및 sql.NullString을 사용하여 Null 허용 문자열 필드를 처리하는 방법은 무엇입니까?

GORM 및 sql.NullString을 사용하여 Null 허용 문자열 필드를 처리하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-06 03:29:02709검색

How to Handle Nullable String Fields with GORM and sql.NullString?

Type String을 sql.NullString으로 사용할 수 없습니다

Query

GORM에서 NULL일 수 있는 필드에 대해 sql.NullString을 사용하면 오류:

cannot use "a string goes here", (type string) as type sql.NullString in field value

간단한 GORM 검증 예제를 실행하는 동안.

해결

sql.NullString은 문자열 유형이 아니라 다음과 같이 정의된 구조체 유형입니다.

type NullString struct {
    String string
    Valid  bool // Valid is true if String is not NULL
}

올바르게 초기화하려면 다음 구문을 사용하세요.

db.Create(&Day{
    Nameday:     "Monday",
    Dateday:     "23-10-2019",
    Something:   sql.NullString{String: "a string goes here", Valid: true},
    Holyday:     false,
})

대체 솔루션

또는 더 간단한 초기화 구문을 유지하려면:

  1. 사용자 정의 nullable 문자열 유형 정의:

    type MyString string
  2. 값 변환을 처리하려면 sql.Scanner 및 드라이버.Valuer 인터페이스를 구현합니다.
  3. 재정의 Value() 및 Scan() 메서드는 다음과 같습니다.

    func (s MyString) Value() (driver.Value, error) {
        if s == MyStringNull {
            return nil, nil
        }
        return []byte(s), nil
    }
    
    func (s *MyString) Scan(src interface{}) error {
        switch v := src.(type) {
        case string:
            *s = MyString(v)
        case []byte:
            *s = MyString(v)
        case nil:
            *s = MyStringNull
        }
        return nil
    }
  4. Something 필드를 MyString으로 선언하고 의도한 대로 초기화합니다.

    db.Create(&Day{
        Nameday:     "Monday",
        Dateday:     "23-10-2019",
        // Here, an untyped string constant will explicitly convert to MyString because they have the same underlying type.
        Something:   "a string goes here",
        Holyday:     false,
    })

위 내용은 GORM 및 sql.NullString을 사용하여 Null 허용 문자열 필드를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.