连接mysql数据库 。
//使用mysql
db,err:=sql.Open("mysql","root:abc123456@/staryuhenzdy") //"user:password@/staryuhenzdy
解析: 使用mysql连接,root是账号,abc123456是密码,@/是默认的数据库端口和地址,staryuhenzdy则是数据库架构
插入数据方式1:
stmt,err:=db.Prepare("insert into staryuhenzdy.zdy set Name=?,Password=?,Conreol=?")
check(err)
res,err:=stmt.Exec("iutrg","ghjgh","2000")
ids,err:=res.LastInsertId()
check(err)
解析:Name,Password,Conreol,代表着数据库的三个字段
check指的是处理错误的函数:
func check(err error) {
if err !=nil{
log.Fatalln(err)
}
}
res.LastInsertId(),指的是返回受影响的id
插入数据的第二种:
stmt,err:=db.Exec("insert into staryuhenzdy.zdy(Name, Password, Conreol) values(?,?,?)","另一种方式","dsfgsdg",200)
check(err)
ids,_:=stmt.LastInsertId() //新增数据的id
i,_:=stmt.RowsAffected() //受到影响的行
fmt.Println("新增的数据:",ids,"受到影响的行",i)
解析:Exec操作数据库而不是使用预处理,三个问号对应着数据库的那三个字段staryuhenzdy.zdy(Name, Password, Conreol) 。
后面插入需要的数据。
更新数据:
res,err := db.Exec("update staryuhenzdy.zdy set Conreol=400 where Name=?","另一种方式")
check(err)
//更改后的数据
check(err)
code,err:=res.RowsAffected()
check(err)
fmt.Println(code)
解析:“另一种方式”,表示更新数据的选择字段属性,毕竟where Name,而Conreol=400,表示将Name属性为另一种方式的行的Conreol字段更新为400,在上面增加数据的Conreol字段是200,改了之后变400去了。
删除数据:
res,err=db.Exec("delete from staryuhenzdy.zdy where Name=?","sdfds")
check(err)
i,_=res.RowsAffected()
fmt.Println(i)
解析:懂得都懂
查询数据:
//定义数据的架构
type Doctor struct {
name string
password string
conreol int
}
//查询多条数据库
res3,err:=db.Query("select * from staryuhenzdy.zdy where Conreol>=?",1000)
var docList []Doctor
for res3.Next() {
var doc2 Doctor
res3.Scan(&doc2.name, &doc2.password, &doc2.conreol)
//加入数组
docList = append(docList, doc2)
}
fmt.Println("多条数据查询结果", docList)
这里部分使用的查询都是使用Exec类型,建议使用预处理方式sql注入。
Prepare方法会先将sql语句发送给MySQL服务端,返回一个准备好的状态用于之后的查询和命令。返回值可以同时执行多个查询和命令。
预处理增加:
sqlStr := "insert into user(name, age) values (?,?)"
stmt, err := db.Prepare(sqlStr)
if err != nil {
fmt.Printf("prepare failed, err:%v\n", err)
return
}
defer stmt.Close()
_, err = stmt.Exec("小王子", 18)
if err != nil {
fmt.Printf("insert failed, err:%v\n", err)
return
}