cpp

MySQL. Обработка значения NULL

Значением поля по умолчанию может быть NULL. Давайте добавим новую запись в таблицу rubr:

INSERT INTO `rubr` (`id_rubr`, `name_rubr`) VALUES (4, NULL);

Если мы сейчас запустим код из листинга 16.5, то получим сообщение об ошибке:

sql: Scan error on column index 1, name "name_rubr": converting NULL to 
string is unsupported

Чтобы избежать ошибки, следует объявлять переменные с типами следующих структур:

type NullBool struct {
   Bool  bool
   Valid bool
}
type NullByte struct {
   Byte  byte
   Valid bool
}
type NullInt16 struct {
   Int16 int16
   Valid bool
}
type NullInt32 struct {
   Int32 int32
   Valid bool
}
type NullInt64 struct {
   Int64 int64
   Valid bool
}
type NullFloat64 struct {
   Float64 float64
   Valid   bool
}
type NullString struct {
   String string
   Valid  bool
}
type NullTime struct {
   Time  time.Time
   Valid bool
}
type RawBytes []byte

Изменим объявление структуры Rubr, в которую мы записываем результат:

type Rubr struct {
   id   int
   name sql.NullString
}

Проверить наличие значения, отличного от NULL, можно с помощью поля Valid. Если поле содержит значение true, то можно получить значение с помощью второго поля структуры, название которого зависит от типа структуры. Пример:

if rubr.name.Valid {
   fmt.Println(rubr.id, rubr.name.String)
} else {
   fmt.Println(rubr.id, "NULL")
}

Пример обработки значения NULL приведен в листинге 16.8.

Листинг 16.8. Обработка значения NULL

package main

import (
   "database/sql"
   "fmt"
   "os"

   _ "github.com/go-sql-driver/mysql"
)

type Rubr struct {
   id   int
   name sql.NullString
}

func main() {
   db, err := sql.Open("mysql", "root:@/godb")
   if err != nil {
      fmt.Fprintln(os.Stderr, err)
      return
   }
   defer db.Close()
   rows, err := db.Query("SELECT * FROM `rubr`")
   if err != nil {
      fmt.Fprintln(os.Stderr, err)
      return
   }
   defer rows.Close()
   rubr := Rubr{}
   for rows.Next() {
      err := rows.Scan(&rubr.id, &rubr.name)
      if err != nil {
         fmt.Fprintln(os.Stderr, err)
         continue
      }
      if rubr.name.Valid {
         fmt.Println(rubr.id, rubr.name.String)
      } else {
         fmt.Println(rubr.id, "NULL")
      }
   }
   if err = rows.Err(); err != nil {
      fmt.Fprintln(os.Stderr, err)
      return
   }
}

Результат:

C:\book\packages>go run main.go
1 Программирование
2 Музыка
3 Поисковые порталы
4 NULL

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp