1、示例1 读取null值错误情况
package main
import (
"database/sql"
"fmt"
"log"
_ "test_mysql4/mysql-1.4"
)
var db *sql.DB
// 声明一个user结构体
type boot struct {
erp_product_model string
mylen string
problems string
id int
}
func initDB() (err error) {
dsn := "test5:test5@tcp(172.16.3.xxx:3306)/xxx?charset=utf8&parseTime=True&allowOldPasswords=1"
db, err = sql.Open("mysql", dsn) // 打开一个数据库连接,不会校验用户名和密码是否正确
if err != nil {
return err
}
err = db.Ping() //此时验证数据库是否连接成功
if err != nil {
return err
}
return
}
// 连接mysql示例
func main() {
err := initDB() // 连接数据库
if err != nil {
log.Println("数据库连接失败", err)
return
}
fmt.Println("数据库连接成功")
s := "SELECT eqpt_no, repair_name, problems, id FROM repair_record WHERE finish_time>DATE_SUB(CURDATE(),INTERVAL 2 DAY)"
r, err := db.Query(s)
var b boot
defer r.Close()
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
for r.Next() {
r.Scan(&b.erp_product_model, &b.mylen, &b.problems, &b.id)
fmt.Println(b)
}
}
defer r.Close()
}
2、示例1执行结果
3、示例2 读取null值正确情况
package main
import (
"database/sql"
"fmt"
"log"
_ "test_mysql4/mysql-1.4"
)
var db *sql.DB
// 声明一个user结构体
type boot struct {
erp_product_model string
mylen sql.NullString
problems string
id int
}
func initDB() (err error) {
dsn := "test5:test5@tcp(172.16.3.xxx:3306)/xxx?charset=utf8&parseTime=True&allowOldPasswords=1"
db, err = sql.Open("mysql", dsn) // 打开一个数据库连接,不会校验用户名和密码是否正确
if err != nil {
return err
}
err = db.Ping() //此时验证数据库是否连接成功
if err != nil {
return err
}
return
}
// 连接mysql示例
func main() {
err := initDB() // 连接数据库
if err != nil {
log.Println("数据库连接失败", err)
return
}
fmt.Println("数据库连接成功")
s := "SELECT eqpt_no, repair_name, problems, id FROM repair_record WHERE finish_time>DATE_SUB(CURDATE(),INTERVAL 2 DAY)"
r, err := db.Query(s)
var b boot
defer r.Close()
if err != nil {
fmt.Printf("err: %v\n", err)
} else {
for r.Next() {
r.Scan(&b.erp_product_model, &b.mylen, &b.problems, &b.id)
fmt.Println(b)
}
}
defer r.Close()
}
4、示例2执行结果
5、解决办法
定义结构体时,把可能为null值的字段定义为sqlNullxxx
本例子中把 mylen string 修改为 mylen sql.NullString