golangはデータベースのnull値を解決します.

3704 ワード

回転:http://blog.csdn.net/qq_1537667/articale/details/78780945
要点
データベースからnull値が可能な場合は、sql.NULL****を使って読み取ります.IFNULL、COALESCEなどのコマンドを使用して、データベースクエリ値を返さないようにします.あるいはNULLの場合は、データベースにnull値を挿入する必要がありますが、sql.NULL**を使用して必要な値を格納し、NULL値を挿入してそのままsql.NULL****タイプを使用すると、valid設定漏れなどの問題が発生しやすくなります.普通int、stringと変換する場合は、簡単なget、set関数をいくつか書いてください.
NULL値をデータベースから読み出す
Scan NULL値からstringのエラーsql:Scan error on column index 1:unsupported Scan、storing driver.Value type*string Scan NULL値からintのエラーsql:Scan column index 1:converting drive.Vlitype
sqlNull**を使って、ソースの定義は以下の通りです.
type NullInt64 struct {
    Int64 int64
    Valid bool // Valid is true if Int64 is not NULL
}
func (n *NullInt64) Scan(value interface{}) error
func (n NullInt64) Value() (driver.Value, error)

type NullString struct {
    String string
    Valid  bool // Valid is true if String is not NULL
}
func (ns *NullString) Scan(value interface{}) error
func (ns NullString) Value() (driver.Value, error)
以下のように実現します
type Person struct {
    firstName               string
    lastNullName            sql.NullString
    nullAge                 sql.NullInt64
}

rowNull := db.QueryRow("SELECT first_name, last_name FROM person WHERE first_name='yousa'")
err = rowNull.Scan(&hello.firstName, &hello.lastNullName)
if err != nil {
    fmt.Println(err)
}
fmt.Println(hello)

rowNull1 := db.QueryRow("SELECT first_name, age FROM person WHERE first_name='yousa'")
err = rowNull1.Scan(&hello.firstName, &hello.nullAge)
if err != nil {
    fmt.Println(err)
}
fmt.Println(hello)