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

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

Mary-Kate Olsen
풀어 주다: 2024-11-06 03:29:02
원래의
708명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿