我正在通过 Go 运行查询stmt, err := db.Prepare(sqlstring)if err != nil{ log.Fatal(err)}defer stmt.Close()这是 sql 字符串?是'安'select k_ele.value as kanji, id as k_ele_id, NULL as r_ele_id, NULL as r_ele_val, NULL as gloss_id, NULL as gloss_valfrom k_ele where value like ?UNION ALLselect k_ele.value as kanji, NULL as k_ele_id, r_ele.id as r_ele_id, r_ele.value as r_ele_val, NULL as gloss_id, NULL as gloss_valfrom r_ele, k_ele where k_ele.value like ? and k_ele.fk = r_ele.fkUNION ALLselect k_ele.value as kanji, NULL as k_ele_id, NULL as r_ele_id, NULL as r_ele_val, gloss.id as gloss_id, gloss.value as gloss_valfrom sense, gloss, k_elewhere k_ele.value like ? and k_ele.fk = sense.fk and gloss.fk = sense.id;这个查询可以通过控制台上的 sqlite3 和 SQLite 的 DB 浏览器很好地使用,并返回 8 行,甚至 go 代码中的 for 循环循环 8 次。问题是,在rows.Scan()除了出现在每一行中的汉字(因为它在每一行中)之外,没有任何列值存储在变量中,但除了汉字之外什么都没有在 log.Println() 中打印出来。 rows, err := stmt.Query(parameter,parameter,parameter) if err != nil { log.Fatal(err) } defer rows.Close() for rows.Next() { var kanji, r_ele_val, gloss_val string var k_ele_id, r_ele_id, gloss_id int rows.Scan(&kanji,&k_ele_id,&r_ele_id,&r_ele_val,&gloss_id,&gloss_val) log.Println(kanji,k_ele_id, r_ele_id,r_ele_val,gloss_id,gloss_val) }这是输出(它是?因为我的 cmd 无法打印日语字符(如果将 ? 发送到我的浏览器,它将正确显示字符)2015/02/11 22:18:42 ? 105921 0 02015/02/11 22:18:42 ? 0 0 02015/02/11 22:18:43 ? 0 0 02015/02/11 22:18:43 ? 0 0 02015/02/11 22:18:43 ? 0 0 02015/02/11 22:18:43 ? 0 0 02015/02/11 22:18:43 ? 0 0 02015/02/11 22:18:43 ? 0 0 0奇怪的是,如果我更改列的顺序,例如将gloss_id、gloss_val 放在select 语句中。每个变量都存储为 0,甚至是在gloss_id 具有值之前的汉字。(这些是相同的数据集)
1 回答
冉冉说
TA贡献1877条经验 获得超1个赞
Rows.Scan 不会在不抛出错误的情况下将值扫描为 int 和 string 类型。正确使用的类型是 sql.NullInt64 和 sql.NullString,这些类型将正确保存值并有一个 bool val 用于检查它是否为 nil。
- 1 回答
- 0 关注
- 149 浏览
添加回答
举报
0/150
提交
取消