Сканирование Golang Mysql возвращает нули, когда данные есть? - PullRequest
0 голосов
/ 25 сентября 2018

Имея немного головокружительного момента.У меня есть следующая структура:

type Room struct {
    ID              int
    Name            string
    RoomType        int
    CreatedAt       time.Time
    UpdatedAt       time.Time
    DeletedAt       time.Time
    GroupId         int
    BlockId         int
    ProjectId       int
    RoomLength      float64
    RoomWidth       float64
    CeilingHeight   float64
    CeilingColorHex string
    WallColorHex    string
    FloorColorHex   string
    CeilingColorRgb string
    WallColorRgb    string
    FloorColorRgb   string
}

Считывание его в остальные API с:

database := db.New()
stmt, err := database.Prepare("SELECT * FROM room WHERE block_id = ?")
if err != nil {
    panic(err)
}
defer stmt.Close()

rows, err := stmt.Query(c.Param("id"))
if err != nil {
    panic(err)
}
defer rows.Close()

var rooms []common.Room
for rows.Next() {
    var r common.Room
    err := rows.Scan(&r.ID, &r.Name, &r.RoomType, &r.CreatedAt, &r.UpdatedAt, &r.DeletedAt,
        &r.GroupId, &r.BlockId, &r.ProjectId, &r.RoomLength, &r.RoomWidth, &r.CeilingHeight,
        &r.CeilingColorHex, &r.WallColorHex, &r.FloorColorHex, &r.CeilingColorRgb, &r.WallColorRgb,
        &r.FloorColorRgb)
    if err = rows.Err(); err != nil {
        panic(err)
    }

    fmt.Printf("Found: %v", r)
    rooms = append(rooms, r)
}

Тем не менее, в результате полезная нагрузка:

{3 Loki #1 3 2018-09-25 08:42:38 +0000 UTC 2018-09-25 14:52:39 +0000 UTC 0001-01-01 00:00:00 +0000 UTC 0 0 0 0 0 0      }

Я специально после длины / ширины, которые (выше) равны 0. Тем не менее в БД:

mysql> select * from room where id = 3 \G
*************************** 1. row ***************************
               id: 3
             name: Loki #1
        room_type: 3
       created_at: 2018-09-25 08:42:38
       updated_at: 2018-09-25 14:52:39
       deleted_at: NULL
         group_id: 0
         block_id: 1
       project_id: 0
      room_length: 10
       room_width: 7
   ceiling_height: 4
ceiling_color_hex: #c0c0c0
   wall_color_hex: #a9a9a9
  floor_color_hex: #708090
ceiling_color_rgb: 192,192,192
   wall_color_rgb: 169,169,169
  floor_color_rgb: 112,128,144
1 row in set (0.00 sec)

Я думал, что это может иметь какое-то отношение к различным типам, но после изменения их в БД, а затем в коде, без изменений.Может кто-нибудь объяснить, почему .Scan не принимает определенные значения?

Спасибо!

1 Ответ

0 голосов
/ 25 сентября 2018

Прежде всего, проверьте ошибку, которая исходит от rows.Scan () .Вы проверяете только ошибку из rows.Err () , которая является ошибкой другого типа и не связана с проверкой.

err := rows.Scan(&r.ID, &r.Name, &r.RoomType, &r.CreatedAt, &r.UpdatedAt, &r.DeletedAt,
    &r.GroupId, &r.BlockId, &r.ProjectId, &r.RoomLength, &r.RoomWidth, &r.CeilingHeight,
    &r.CeilingColorHex, &r.WallColorHex, &r.FloorColorHex, &r.CeilingColorRgb, &r.WallColorRgb,
    &r.FloorColorRgb)
if err != nil {
    panic(err) // Error related to the scan
}
if err = rows.Err(); err != nil {
    panic(err) // Error related to the iteration of rows
}

Когда возвращается значение из deleted_atкак NULL, Scan вернет ошибку, такую ​​как unsupported Scan, storing driver.Value type <nil> into type *time.Time, а остальная часть вашей структуры получит нулевые значения .

Это означает, что ваша структура комнаты должна измениться, чтобы использоватьуказатель на время.

CreatedAt       *time.Time
UpdatedAt       *time.Time
DeletedAt       *time.Time

Однако вам может потребоваться добавить в sql.Open () параметр parseTime sql.Open("mysql", "user:password@/dbname?parseTime=true), чтобы правильно проанализировать время для mysql.

Затем вы должны получить действительное * время. Время, когда оно установлено, или ноль, если оно равно NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...