golang mysql demo
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相关推荐
- golang 并发demo 写入 redis
原文链接:golang 并发demo 写入 redis 源代码: package mainimport ("fmt""runtime""strconv ...
- golang mysql 如何设置最大连接数和最大空闲连接数
本文介绍golang 中连接MySQL时,如何设置最大连接数和最大空闲连接数. 关于最大连接数和最大空闲连接数,是定义在golang标准库中database/sql的. 文中例子连接MySQL用的SQ ...
- golang mysql 事务_golang的嵌套事务管理-Go语言中文社区
golang的事务管理是一件很麻烦的事,,能不能像Java那样,通过Spring管理事务,最近琢磨了一下,写了一个demo,用来管理golang的事务,使其支持golang事务的嵌套调用. 其思想很简 ...
- golang mysql商业用例_完美起航-golang操作mysql用例
golang操作mysql的demo,直接上代码 package main import ( "database/sql" "fmt" _ "gith ...
- golang mysql 错误 sql: unknown driver “mysql“ (forgotten import?) 解决方法
golang中使用gorm连接mysql的时候会报错:sql: unknown driver "mysql" (forgotten import?) 需要在连接数据库的文件中引入 ...
- golang mysql 基本操作
导入数据库驱动 import ("database/sql""fmt"_ "github.com/go-sql-driver/mysql"& ...
- golang MySQL 占内存_golang操作mysql使用总结
前言 Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能: sql.DB 通过数据库驱动为我们提供管理底层 ...
- golang grpc demo
1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...
- golang rpc demo
RPC工作流程图 1.调用客户端句柄:执行传送参数 2.调用本地系统内核发送网络消息 3.消息传送到远程主机 4.服务器句柄得到消息并取得参数 5.执行远程过程 6.执行的过程将结果返回服务器句柄 7 ...
最新文章
- Gitlab+Jenkins学习之路(三)之gitlab权限管理--issue管理
- 全套L4自动驾驶方案降至1万美元,RoboTaxi玩家的反击开始了
- c语言程序设计第3周编程作业(数字特征)
- Mockito 简明教程
- VisualSVN Server安装过程
- 左连接 和右链接的区别,内连接和外连接的区别
- Spring Boot结合spring-data-jpa
- Angular component的一个例子
- vue element-ui级联选择器选中后下拉框自动收起
- 1286:怪盗基德的滑翔翼-2019-07-03(《信息学奥赛一本通》)
- Qt实践|HTTP知识点-使用百度AI语音识别服务
- linux /etc/group文件详解
- Web安全相关(二):跨站请求伪造(CSRF/XSRF)
- 《我的祖国》正确英译应该是《The Evercountry, Mine》
- 10款精选的后台管理系统,收藏吧!
- 【实验技术笔记】细胞表型检测之细胞凋亡(Hoechst染色 + PI染色 + TUNEL 染色 + Annexin V-PI 双染)
- Elasticsearch(Transport Client)常用操作
- 瑞幸的野望,小鹿茶的突袭
- 计算机在随机抽样上的应用,数理统计学中随机抽样的应用研究
- clickhouse的傻瓜式安装和基础入门
热门文章
- linux中vi大括号enter缩进,格式 – 如何在vi中对齐代码(大括号,括号等)?
- MySQL中的show full columns from 表名
- php composer 缓慢,php – 下载Laravel时,Composer非常慢
- java new thread参数_java线程池01-ThreadPoolExecutor构造方法参数的使用规则
- java写一个搜索引擎_搜索引擎—-Java实现一个简单的网络爬虫
- mysql扩展使用_mysql的扩展应用
- matlab 填充数组,Matlab自动将数组类型从复数转换为double
- python input函数赋值法_大佬们 我是刚开始学python的小白 遇到这种赋值方式 实在不懂这个a+b是赋值给谁的 求解...
- 【Centos 7】【Docker】 安装 kafka
- nginx: [emerg] duplicate “log_format“ name “main“ in /usr/local/phpstudy/vhost/sys/nginx/sys.conf:11