Go操作Mysql数据库

使用Go操作MySQL等数据库,一般有两种方式:一是使用database/sql接口,直接在代码里硬编码sql语句;二是使用gorm,即对象关系映射的方式在代码里抽象的操作数据库。一般推荐使用第二种方式。

使用database/sql接口

Go没有内置的驱动支持任何数据库,但是Go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动。但缺点是,直接用 github.com/go-sql-driver/mysql 访问数据库都是直接写 sql,取出结果然后自己拼成对象,使用上面不是很方便,可读性也不好。

下载包

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

源码如下:

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""time"
)//数据库连接信息
const (USERNAME = "root"PASSWORD = "123qwe"NETWORK  = "tcp"SERVER   = "127.0.0.1"PORT     = 3306DATABASE = "test"
)//user表结构体定义
type User struct {Id         int    `json:"id" form:"id"`Username   string `json:"username" form:"username"`Password   string `json:"password" form:"password"`Status     int    `json:"status" form:"status"` // 0 正常状态, 1删除Createtime int64  `json:"createtime" form:"createtime"`
}func CreateTable(DB *sql.DB) {sql := `CREATE TABLE IF NOT EXISTS users(id INT(4) PRIMARY KEY AUTO_INCREMENT NOT NULL,username VARCHAR(64),password VARCHAR(64),status INT(4),createtime INT(10)); `if _, err := DB.Exec(sql); err != nil {fmt.Println("create table failed:", err)return}fmt.Println("create table successd")
}//插入数据
func InsertData(DB *sql.DB) {result, err := DB.Exec("insert INTO users(username,password) values(?,?)", "demo", "123qwe")if err != nil {fmt.Printf("Insert data failed,err:%v", err)return}lastInsertID, err := result.LastInsertId() //获取插入数据的自增IDif err != nil {fmt.Printf("Get insert id failed,err:%v", err)return}fmt.Println("Insert data id:", lastInsertID)rowsaffected, err := result.RowsAffected() //通过RowsAffected获取受影响的行数if err != nil {fmt.Printf("Get RowsAffected failed,err:%v", err)return}fmt.Println("Affected rows:", rowsaffected)
}//查询单行
func QueryOne(DB *sql.DB) {user := new(User) //用new()函数初始化一个结构体对象row := DB.QueryRow("select id,username,password from users where id=?", 1)//row.scan中的字段必须是按照数据库存入字段的顺序,否则报错if err := row.Scan(&user.Id, &user.Username, &user.Password); err != nil {fmt.Printf("scan failed, err:%v\n", err)return}fmt.Println("Single row data:", *user)
}//查询多行
func QueryMulti(DB *sql.DB) {user := new(User)rows, err := DB.Query("select id,username,password from users where id = ?", 2)defer func() {if rows != nil {rows.Close() //关闭掉未scan的sql连接
        }}()if err != nil {fmt.Printf("Query failed,err:%v\n", err)return}for rows.Next() {err = rows.Scan(&user.Id, &user.Username, &user.Password) //不scan会导致连接不释放if err != nil {fmt.Printf("Scan failed,err:%v\n", err)return}fmt.Println("scan successd:", *user)}
}//更新数据
func UpdateData(DB *sql.DB) {result, err := DB.Exec("UPDATE users set password=? where id=?", "111111", 1)if err != nil {fmt.Printf("Insert failed,err:%v\n", err)return}fmt.Println("update data successd:", result)rowsaffected, err := result.RowsAffected()if err != nil {fmt.Printf("Get RowsAffected failed,err:%v\n", err)return}fmt.Println("Affected rows:", rowsaffected)
}//删除数据
func DeleteData(DB *sql.DB) {result, err := DB.Exec("delete from users where id=?", 1)if err != nil {fmt.Printf("Insert failed,err:%v\n", err)return}fmt.Println("delete data successd:", result)rowsaffected, err := result.RowsAffected()if err != nil {fmt.Printf("Get RowsAffected failed,err:%v\n", err)return}fmt.Println("Affected rows:", rowsaffected)
}func main() {conn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE)fmt.Println("conn: ", conn)DB, err := sql.Open("mysql", conn)if err != nil {fmt.Println("connection to mysql failed:", err)return}DB.SetConnMaxLifetime(100 * time.Second) //最大连接周期,超时的连接就closeDB.SetMaxOpenConns(100)                  //设置最大连接数
    CreateTable(DB)InsertData(DB)QueryOne(DB)QueryMulti(DB)UpdateData(DB)DeleteData(DB)
}

运行结果如下:

[root@localhost mysql]# go run main.go
conn:  root:123qwe@tcp(127.0.0.1:3306)/test
create table successd
Insert data id: 2
Affected rows: 1
scan failed, err:sql: no rows in result set
scan successd: {2 demo 123qwe 0 0}
update data successd: {0xc0000d8000 0xc0000d60b0}
Affected rows: 0
delete data successd: {0xc0000d8000 0xc000016330}
Affected rows: 0

转载于:https://www.cnblogs.com/wangjq19920210/p/11577314.html

golang mysql demo相关推荐

  1. golang 并发demo 写入 redis

    原文链接:golang 并发demo 写入 redis 源代码: package mainimport ("fmt""runtime""strconv ...

  2. golang mysql 如何设置最大连接数和最大空闲连接数

    本文介绍golang 中连接MySQL时,如何设置最大连接数和最大空闲连接数. 关于最大连接数和最大空闲连接数,是定义在golang标准库中database/sql的. 文中例子连接MySQL用的SQ ...

  3. golang mysql 事务_golang的嵌套事务管理-Go语言中文社区

    golang的事务管理是一件很麻烦的事,,能不能像Java那样,通过Spring管理事务,最近琢磨了一下,写了一个demo,用来管理golang的事务,使其支持golang事务的嵌套调用. 其思想很简 ...

  4. golang mysql商业用例_完美起航-golang操作mysql用例

    golang操作mysql的demo,直接上代码 package main import ( "database/sql" "fmt" _ "gith ...

  5. golang mysql 错误 sql: unknown driver “mysql“ (forgotten import?) 解决方法

    golang中使用gorm连接mysql的时候会报错:sql: unknown driver "mysql" (forgotten import?) 需要在连接数据库的文件中引入  ...

  6. golang mysql 基本操作

    导入数据库驱动 import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"& ...

  7. golang MySQL 占内存_golang操作mysql使用总结

    前言 Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能: sql.DB 通过数据库驱动为我们提供管理底层 ...

  8. golang grpc demo

    1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...

  9. golang rpc demo

    RPC工作流程图 1.调用客户端句柄:执行传送参数 2.调用本地系统内核发送网络消息 3.消息传送到远程主机 4.服务器句柄得到消息并取得参数 5.执行远程过程 6.执行的过程将结果返回服务器句柄 7 ...

最新文章

  1. Gitlab+Jenkins学习之路(三)之gitlab权限管理--issue管理
  2. 全套L4自动驾驶方案降至1万美元,RoboTaxi玩家的反击开始了
  3. c语言程序设计第3周编程作业(数字特征)
  4. Mockito 简明教程
  5. VisualSVN Server安装过程
  6. 左连接 和右链接的区别,内连接和外连接的区别
  7. Spring Boot结合spring-data-jpa
  8. Angular component的一个例子
  9. vue element-ui级联选择器选中后下拉框自动收起
  10. 1286:怪盗基德的滑翔翼-2019-07-03(《信息学奥赛一本通》)
  11. Qt实践|HTTP知识点-使用百度AI语音识别服务
  12. linux /etc/group文件详解
  13. Web安全相关(二):跨站请求伪造(CSRF/XSRF)
  14. 《我的祖国》正确英译应该是《The Evercountry, Mine》
  15. 10款精选的后台管理系统,收藏吧!
  16. 【实验技术笔记】细胞表型检测之细胞凋亡(Hoechst染色 + PI染色 + TUNEL 染色 + Annexin V-PI 双染)
  17. Elasticsearch(Transport Client)常用操作
  18. 瑞幸的野望,小鹿茶的突袭
  19. 计算机在随机抽样上的应用,数理统计学中随机抽样的应用研究
  20. clickhouse的傻瓜式安装和基础入门

热门文章

  1. linux中vi大括号enter缩进,格式 – 如何在vi中对齐代码(大括号,括号等)?
  2. MySQL中的show full columns from 表名
  3. php composer 缓慢,php – 下载Laravel时,Composer非常慢
  4. java new thread参数_java线程池01-ThreadPoolExecutor构造方法参数的使用规则
  5. java写一个搜索引擎_搜索引擎—-Java实现一个简单的网络爬虫
  6. mysql扩展使用_mysql的扩展应用
  7. matlab 填充数组,Matlab自动将数组类型从复数转换为double
  8. python input函数赋值法_大佬们 我是刚开始学python的小白 遇到这种赋值方式 实在不懂这个a+b是赋值给谁的 求解...
  9. 【Centos 7】【Docker】 安装 kafka
  10. nginx: [emerg] duplicate “log_format“ name “main“ in /usr/local/phpstudy/vhost/sys/nginx/sys.conf:11