原作者:学生黄哲
Go标准库中没有数据库驱动程序。第三方驱动见http://golang.org/s/sqldrivers。
这里选择Go-MySQL-Driver。地址是:https://github.com/go-sql-driver/mysql/.
装置:goget github.com/go-sql-driver/mysql
官方数据库/sql包文档:https://studygolang.com/pkgdoc
关于MySQL的基本操作,你可以看看我的另一本简书:https://www.jianshu.com/p/2e01f4c6b626
使用的数据库定义如下
首先,打开数据库
功能原型
函数打开(驱动名称,数据源名称字符串)(*数据库,错误)
Open打开一个由dirverName指定的数据库,dataSourceName指定数据源,一般至少包括数据库文件名和(可能的)连接信息。
1//步骤:以帐户名:密码@/数据库名的格式打开数据库?编码类型
2db,err := sql。Open( "mysql "," root:123@/mydb?charset=utf8”)
3iferr!=零{
4fmt。Println(err)
5}
6//关闭数据库
7延期b。关闭()
二、查询数据
功能原型
函数(数据库*数据库)查询(查询字符串,参数...接口{ })(*行,错误)
查询执行一个查询并返回多行结果(行),这通常用于执行select命令。参数args表示查询中的占位符参数。
1varid int
2字母字符串
3可变价格浮动64
4//查询数据,指定字段名,返回sql。行结果集
5行,err := db。查询(“从产品中选择标识、名称、价格”)
6iferr!=零{
7fmt。Println(err)
8}
9借出。Next() {
10排。扫描(& ampid,amp。名称,&。价格)
11fmt。Println(id、名称、价格)
12}
13个错误。关闭()
行。next()迭代查询数据。
Rows.scan()读取每行的值
Rows.close()关闭查询
第三,查询一行数据
功能原型
func (db *DB) QueryRow(查询字符串,参数...接口{ })*行
QueryRow执行一次查询,最多返回一行结果(即第行)。QueryRow总是返回一个非零值,并且在调用返回该值的Scan方法之前不会返回延迟错误。
1//查询数据可以使用和来限定多个条件,或或(或)
2 row 3:= db。query row(" selected,nameFROMproduct WHEREid=?还是大米之类的?”, 1,1.11)
3//row 3:= db。query row(" selected,namefromproduct,其中id= 1 ")
4行3。扫描(& ampid,amp。名称)
5fmt。Println(id,名称)
六
第四,插入一行数据
功能原型
func (s *Stmt) Exec(args...接口{})(结果,错误)
Exec使用提供的参数来执行准备好的命令状态,并返回状态执行结果的摘要。
1//插入数据
2ret,_ := db。Exec(" insertintoproduct( id,name,price)值(15,' dog ',30)")
3/3//LastInsertId返回数据库生成的响应命令的整数。
4//返回插入的标识
5insID,_ := ret。LastInsertId()
6fmt。Println(insID)
七
由ret插入的ID。lastinstid()
受ret影响的行数。rowsaffected()
动词 (verb的缩写)数据修订
1//更新数据和修改id >:第1行的名称
2ret2,_ := db。exec(" update product set name = ' 000 '其中id >为。?", 1)
3//得到影响数
4aff_nums,_ := ret2。RowsAffected()
5fmt。Println(aff_nums)
不及物动词删除数据
1//删除数据,删除id=3的行
2ret3,_ := db。exec(" delete from product where id =?",3)
3delNums,_ := ret3。RowsAffected()
4fmt。Println(delNums)
五
七.预处理
功能原型
函数(数据库*数据库)准备(查询字符串)(*Stmt,错误)
准备为后续的查询和命令创建一个准备好的状态。返回值可以同时执行多个查询和命令。
1//预处理
2stmt,_ := db。准备(" selectid,namefromproduct whereid=?orname=?")
3//找到id为3或姓名为000的人
4row4,_ := stmt。查询(3,“000”)
5//注意,这需要Next(),否则无法获得任何值。
6代表第4行。Next() {
7行4。扫描(& ampid,amp。名称)
8fmt。Println(id,名称)
9}
10//预处理插入数据
11stmt2,_ := db。准备("插入产品(名称、id、价格)值(?,?,null)")
12//名字是lisi,id是22
13rows5,_ := stmt2。Exec("lisi ",22)
14fmt。Println(第5行。RowsAffected())
15
八.交易处理
功能原型
func (db *DB) Begin() (*Tx,错误)
开始交易。隔离级别由数据库驱动程序决定。
1//未结交易
2tx,_ := db。开始()
3//id为1的价格+1和id为2的价格-1
4ret4,_ := tx。Exec("更新产品集价格=价格+ 1,其中id =?", 1)
5ret5,_ := tx。Exec("更新产品集价格= price - 1,其中id =?", 2)
六
7//如果id不存在,受影响的行数为0
8//接收受影响的行数。如果为0,它将失败
9updNums1,_ := ret4。RowsAffected()
10updNums2,_ := ret5。RowsAffected()
11ifupdNums1 >0 & amp& ampupdNums2 >0{ //只有两个更新同时成功,才会提交
12tx . submit()//提交交易
13fmt。Println(“成功”)
14}否则{ //否则回滚
15tx。Rollback() //回滚事务
16fmt。打印(“失败”)
17}
Tx.submit()提交事务
Tx.rollback()回滚事务
演示
1打包管理
2导入(
3 "数据库/sql "
4"fmt "
五
6 _ " github . com/go-SQL-driver/MySQL "
7)
8typedbWorker结构{
9dsn字符串
10db *sql。分贝
11用户信息用户tb
12}
13typeusertb结构{
14id int
15//NullString表示可空字符串。
16name sql。空串
17//NullInt64表示可空的浮点值。
18price sql。NullFloat64
19}
20funcmain(){
21varerr错误
22//初始化结构并保存数据库参数
23 dbw:= DBWork {
24 DSN:“root:123 @/mydb?charset=utf8 ",
25}
26//打开数据库并将其保存到结构中的db
27dbw.db,err = sql。Open( "mysql ",dbw.dsn)
28//如果打开失败,紧急出口
29iferr!=零{
30恐慌(错误)
31}
32//关闭数据库
33deferdbw.db.Close()
34//插入数据
35dbw.insertData()
36//获取数据
37 dbw . query data()
38}
39
40//创建方法,插入数据
41 func(dbw * DbWorker)insert data(){
42//预处理,插入数据
43stmt,_:= dbw . db . prepare(` INSERT INTO product(name,id,price) VALUES(?,null,?)`)
44//功能执行完毕并关闭
45延期。关闭()
46//插入数据
47ret,err := stmt。Exec( "hz ",29)
48iferr!=零{
49毫米。Println(err)
50返回
51}
52//获取id,执行成功,打印
53ifLastInsertId,err := ret。lastInsertId();err == nil{
54fmt。Println( "LastInsertId:",LastInsertId)
55}
56//获取行号,执行成功,打印
57ifRowsAffected,err := ret。RowsAffected();err == nil{
58fmt。Println( "RowsAffected:",RowsAffected)
59}
60}
61
62//初始化用户信息
63 func(dbw * DBWorker)query data Plare(){
64dbw.userInfo = usertb{}
65}
66 func(dbw * DBWorker)query data(){
67
68//预处理,查询数据
69stmt,_:= dbw . db . prepare(` select * From product where price & gt;= ?和价格& lt?`)
70
71deferstmt。关闭()
七十二
73 dbw . query datatre()
74//取价格20到30之间的数据
75行,err := stmt。查询(20,30)
76延期。关闭()
77iferr!=零{
78fmt。Println(err)
79返回
80}
81forrows。Next(){
82//检索数据库数据
83路。扫描(& ampdbw.userInfo.id,& ampdbw.userInfo.name,& ampdbw.userInfo.price)
84iferr!=零{
85fmt。Println(err。Error())
86继续
87}
88//如果检索到的数据为空,则赋值0
89if!dbw.userInfo.name.Valid{
90dbw.userInfo.name.String = " "
91}
92if!dbw.userInfo.price.Valid{
93 dbw . userinfo . price . float 64 = 0.00
94}
95fmt。Println( "get data,id:",dbw.userInfo.id," name:",dbw.userInfo.name.String," price ",float 64(dbw . userinfo . price . float 64))
96}
97err =行。Err()
98iferr!=零{
99fmt。Printf(err。Error())
100}
101}
版权声明:内容来自网络,版权归原创作者。除非我们无法确认,否则我们将标记作者和来源。如有侵权,请告知,我们会立即删除并道歉。谢谢你。
ID:Golangweb
www.bytedancing.com
1.《rows Golang学习笔记之Golang与Mysql交互》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《rows Golang学习笔记之Golang与Mysql交互》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/1037902.html