博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言中操作mysql的方法
阅读量:6688 次
发布时间:2019-06-25

本文共 2348 字,大约阅读时间需要 7 分钟。

需要下载指定的golang的mysql驱动包

> go get github.com/go-sql-driver/mysql

下面的例子:

package main;import (	"database/sql"	_ "github.com/go-sql-driver/mysql"	"fmt")func main() {	//打开数据库	//DSN数据源字符串:用户名:密码@协议(地址:端口)/数据库?参数=参数值	db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8");	if err != nil {		fmt.Println(err);	}	//关闭数据库,db会被多个goroutine共享,可以不调用	defer db.Close();	//查询数据,指定字段名,返回sql.Rows结果集	rows, _ := db.Query("select id,name from test");	id := 0;	name := "";	for rows.Next() {		rows.Scan(&id, &name);		fmt.Println(id, name);	}	//查询数据,取所有字段	rows2, _ := db.Query("select * from test");	//返回所有列	cols, _ := rows2.Columns();	//这里表示一行所有列的值,用[]byte表示	vals := make([][]byte, len(cols));	//这里表示一行填充数据	scans := make([]interface{}, len(cols));	//这里scans引用vals,把数据填充到[]byte里	for k, _ := range vals {		scans[k] = &vals[k];	}	i := 0;	result := make(map[int]map[string]string);	for rows2.Next() {		//填充数据		rows2.Scan(scans...);		//每行数据		row := make(map[string]string);		//把vals中的数据复制到row中		for k, v := range vals {			key := cols[k];			//这里把[]byte数据转成string			row[key] = string(v);		}		//放入结果集		result[i] = row;		i++;	}	fmt.Println(result);	//查询一行数据	rows3 := db.QueryRow("select id,name from test where id = ?", 1);	rows3.Scan(&id, &name);	fmt.Println(id, name);	//插入一行数据	ret, _ := db.Exec("insert into test(id,name) values(null, '444')");	//获取插入ID	ins_id, _ := ret.LastInsertId();	fmt.Println(ins_id);	//更新数据	ret2, _ := db.Exec("update test set name = '000' where id > ?", 2);	//获取影响行数	aff_nums, _ := ret2.RowsAffected();	fmt.Println(aff_nums);	//删除数据	ret3, _ := db.Exec("delete from test where id = ?", 3);	//获取影响行数	del_nums, _ := ret3.RowsAffected();	fmt.Println(del_nums);	//预处理语句	stmt, _ := db.Prepare("select id,name from test where id = ?");	rows4, _ := stmt.Query(3);	//注意这里需要Next()下,不然下面取不到值	rows4.Next();	rows4.Scan(&id, &name);	fmt.Println(id, name);	stmt2, _ := db.Prepare("insert into test values(null, ?, ?)");	rows5, _ := stmt2.Exec("666", 66);	fmt.Println(rows5.RowsAffected());	//事务处理	tx, _ := db.Begin();	ret4, _ := tx.Exec("update test set price = price + 100 where id = ?", 1);	ret5, _ := tx.Exec("update test set price = price - 100 where id = ?", 2);	upd_nums1, _ := ret4.RowsAffected();	upd_nums2, _ := ret5.RowsAffected();	if upd_nums1 > 0 && upd_nums2 > 0 {		//只有两条更新同时成功,那么才提交		tx.Commit();	} else {		//否则回滚		tx.Rollback();	}}

 

转载地址:http://ajhao.baihongyu.com/

你可能感兴趣的文章
<转>关闭 程序崩溃时 windows 正在检查该问题的解决方案
查看>>
每天一个linux命令(7):mv命令
查看>>
树莓派进阶之路 (010) - 树莓派raspi-config配置(转)
查看>>
SQL中PIVOT 行列转换
查看>>
C# ini文件操作【源码下载】
查看>>
基于iscroll.js实现下拉刷新和上拉加载特效
查看>>
【日常小记】统计后缀名为.cc、.c、.h的文件数【转】
查看>>
C#窗体的加载等待(BackgroundWorker控件)实现
查看>>
Windows Server 2016
查看>>
为什么说invalidate()不能直接在线程中调用
查看>>
Centos7中systemctl命令详解
查看>>
windows使用git时出现:warning: LF will be replaced by CRLF
查看>>
QuickStart OpenvirteX
查看>>
spring- properties 读取的五种方式
查看>>
各种加载(转载)
查看>>
Python Scrapy 自动爬虫注意细节(3)
查看>>
在.NET Core中遭遇循环依赖问题"A circular dependency was detected"
查看>>
3 django系列之Form表单在前端web界面渲染与入库保存
查看>>
Shell脚本与vi编辑器:vi启动与退出、工作模式、命令大全
查看>>
linux设备驱动归纳总结(六):1.中断的实现【转】
查看>>