// 创建数据表内容varschema=`
CREATE TABLE person (
first_name text,
last_name text,
email text
);
CREATE TABLE place (
country text,
city text NULL,
telcode integer
)`db.MustExec(schema)tx:=db.MustBegin()tx.MustExec("INSERT INTO person (first_name, last_name, email) VALUES (?, ?, ?)","Jason","Moiron","jmoiron@jmoiron.net")tx.MustExec("INSERT INTO person (first_name, last_name, email) VALUES (?, ?, ?)","John","Doe","johndoeDNE@gmail.net")tx.MustExec("INSERT INTO place (country, city, telcode) VALUES (?, ?, ?)","United States","New York","1")tx.MustExec("INSERT INTO place (country, telcode) VALUES (?, ?)","Hong Kong","852")tx.MustExec("INSERT INTO place (country, telcode) VALUES (?, ?)","Singapore","65")tx.Commit()
// 注意参数类型jason=Person{}err=db.Get(&jason,"SELECT * FROM person WHERE first_name=?","Jason")fmt.Printf("%#v\n",jason)
5.2 多条数据查询(Select方法)
1
2
3
4
5
6
7
8
// 注意参数类型places:=[]Place{}err=db.Select(&places,"SELECT * FROM place ORDER BY telcode ASC")iferr!=nil{fmt.Println(err)return}usa,singsing,honkers:=places[0],places[1],places[2]
6. 插入数据、更新数据、删除数据
可以直接通过NamedExec()或者Exec()方法来执行语句
1
2
3
result,err:=tx.Exec("INSERT INTO person (first_name, last_name, email) VALUES (?, ?, ?)","Jason","Moiron","jmoiron@jmoiron.net")result.LastInsertId()//返回插入数据后的主键Id值result.RowsAffected()//返回执行SQL后,影响的数据行数
// 单条数据插入示例_,err=db.NamedExec(`INSERT INTO person (first_name,last_name,email) VALUES (:first,:last,:email)`,map[string]interface{}{"first":"Bin","last":"Smuth","email":"bensmith@allblacks.nz",})// 批量插入示例personMaps:=[]map[string]interface{}{{"first_name":"Ardie","last_name":"Savea","email":"asavea@ab.co.nz"},{"first_name":"Sonny Bill","last_name":"Williams","email":"sbw@ab.co.nz"},{"first_name":"Ngani","last_name":"Laumape","email":"nlaumape@ab.co.nz"},}_,err=db.NamedExec(`INSERT INTO person (first_name, last_name, email)
VALUES (:first_name, :last_name, :email)`,personMaps)// 查询示例rows,err=db.NamedQuery(`SELECT * FROM person WHERE first_name=:fn`,map[string]interface{}{"fn":"Bin"})rows,err=db.NamedQuery(`SELECT * FROM person WHERE first_name=:first_name`,jason)
8. 注意事项
8.1 结构体元素首字母没有大写
这个会导致get failed, err:scannable dest type struct with >1 columns (3) in result。这类型错误,可以从代码中发现, 当db.Get方法执行时,sqlx包中会访问对应结构体中的各字段,这时发现字段全部为小写,不可访问,即报错了。我们修改为大写即解决了问题。
8.2 查询出来的字段包含Null
这个会导致converting NULL to string is unsupported这类型错误,可以通过在设置结构体属性类型时,改为对应的sql.Null*类型,例如