1.条件
DBのcolumnにBIGINTで定義したUnix timeをfieldをinteface型で宣言したstructに代入する
この時、database/sql pkgをValidでNullの確認
2.結論
sql.NullString を使う場合とsql.NullInt64 を使う場合で結果は同じ
3.処理のStep
(1) DB側:NULLを含むBIGINTで定義したものにUnix timeを保存
(2) DBからQueryのSELECT文でUnix timeを取り出す
(3) 取り出す変数の型を変えてみる
・sql.NullString を使う場合
・sql.NullInt64 を使う場合
(4) Unix timeをfieldをinteface型で宣言したstructに代入する
4.code :Queryでsql.NullStringを使い取り出した場合、Sprintfは”%s”で変換
type session_s struct { Session_id string `json:"session_id"` Login_time interface{} `json:"login_time"` Logout_time interface{} `json:"logout_time"` } var _r session_s_s; ・・・ var session_id string; var login , logout sql.NullString; var NULL interface {}; for rows.Next() { _ = rows.Scan( &session_id, &login, &logout); if login.Valid { r.Login_time = fmt.Sprintf("%s",login.String); } else { _r.Login_time = NULL; } if logout.Valid { _r.Logout_time = fmt.Sprintf("%s",logout.String); } else { _r.Logout_time = NULL; } fmt.Println("{",_r.Login_time,":", _r.Logout_time,"}"); }
5.実行結果
{ 1641787646985 : 1641792373964 } { 1641792428859 : <nil> } { 1641852057966 : <nil> } { 1641852062604 : 1641856423049 } { 1641856427860 : <nil> }
6.code Queryでsql.NullInt64を使い取り出した場合、Sprintfは”%d”で変換
type session_s struct { Session_id string `json:"session_id"` Login_time interface{} `json:"login_time"` Logout_time interface{} `json:"logout_time"` } var _r session_s_s; ・・・ var session_id string; var login , logout sql.NullInt64; var NULL interface {}; for rows.Next() { _ = rows.Scan( &session_id, &login, &logout); if login.Valid { r.Login_time = fmt.Sprintf("%d",login.String); } else { _r.Login_time = NULL; } if logout.Valid { _r.Logout_time = fmt.Sprintf("%d",logout.String); } else { _r.Logout_time = NULL; } fmt.Println("{",_r.Login_time,":", _r.Logout_time,"}"); }
7.実行結果
{ 1641787646985 : 1641792373964 } { 1641792428859 : <nil> } { 1641852057966 : <nil> } { 1641852062604 : 1641856423049 } { 1641856427860 : <nil> }