封装原因:

查看了很多网上提供的ORM类型的数据库操作,觉得比较麻烦,需要提前配置很多的表结构体,然后才能使用,对于数据表很多的项目就配置起来就比较麻烦,所以对golang的mysql包进行了外层包装,简化在开发中的使用.
实现思路:

通过配置数据库链接,初始化连接(实现连接池),设置连接池参数,并存入map[string]*sql.DB中,在需要时调用.
使用Struct方法,对SQL进行预处理,然后执行相应的SQL,获取数据
配置数据库链接

例如我配置了三个数据库的链接,分别是cms库, base库和sms库,配置代码如下
package config

import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
)

var (
WorkDir string // 项目的根目录
DBConfig map[string]string // 数据库参数配置
)

// 初始化解析Env配置文件
func init() {
// 需要编译后才能生效
WorkDir = filepath.Dir(os.Args[0])
err := os.Setenv("GOPATH", WorkDir)
data, err := ioutil.ReadFile(path.Join(WorkDir, ".env"))
if err != nil {
log.Fatal(err)
}
result := make(map[string]string)
// 把uint8形式转换为map类型数据
// []byte(data) 对字节数组转换成byte类型数据
err = json.Unmarshal([]byte(data), &result)
if err != nil {
log.Fatal(err)
}
// 数据库配置map
dBMap := make(map[string]string)
// 格式化数据库链接
CmsConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/cms?charset=utf8mb4", result["DB_CMS_USER"],
result["DB_CMS_PASS"], result["DB_CMS_HOST"], result["DB_CMS_PORT"])
BaseConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/base?charset=utf8mb4", result["DB_BASE_USER"],
result["DB_BASE_PASS"], result["DB_BASE_HOST"], result["DB_BASE_PORT"])
SmsConnect := fmt.Sprintf("%s:%s@tcp(%s:%s)/sms?charset=utf8mb4", result["DB_SMS_USER"],
result["DB_SMS_PASS"], result["DB_SMS_HOST"], result["DB_SMS_PORT"])
dBMap["cms"], dBMap["base"], dBMap["sms"] = CmsConnect, BaseConnect, SmsConnect
DBConfig = dBMap
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
使用方法

创建-Create方法, 接收参数类型为map[string]interface{}
(1).map中key即为数据表的对应的字段名称,value即为对应要创建的数据字段值
(2).返回结果为新增数据在表中的ID和error信息,新增成功error为nil
import . "mysqldb"
# 例如我想base库的auth_user表添加一条记录,创建的三个字段为手机号phone,姓名real_name,性别sex
createMap := make(map[string]interface{})
createMap["phone"], createMap["name"], createMap["sex"] = "18300000000", "张三", 1
insertId, err := DB("base").Table("auth_user").Create(createMap)
1
2
3
4
5
批量创建-BulkCreate方法,接收参数类型为[]map[string]interface{}
(1).返回结果为影响的行数和error信息,新增成功error为nil
# 例如我想base库的auth_user表添加两条记录,创建的三个字段为手机号phone,姓名real_name,性别sex
var createMap []map[string]interface{}
cMap := make(map[string]interface{})
cMap["phone"], cMap["name"], cMap["sex"] = "18300000000", "张三", 1
createMap = append(createMap, cMap)
cMap["phone"], cMap["name"], cMap["sex"] = "18300000001", "李梅", 2
createMap = append(createMap, cMap)
insertId, err := DB("base").Table("auth_user").BulkCreate(createMap)
1
2
3
4
5
6
7
8
删除-Delete方法
(1). 通过Filter设置筛选条件
(2).返回结果为影响的行数和error信息,删除成功error为nil
# 例如我想删除base库的auth_user表中phone为1830000000的记录
affectRows, err :=DB("base").Table("auth_user").Filter("phone=?", "18300000000").Delete()
1
2
更新-Update方法,接收参数类型为map[string]interface{}
(1). 通过Filter设置筛选条件
(2).返回结果为影响的行数和error信息,更新成功error为nil
# 例如我要更新base库的auth_user表中phone为18300000000数据的姓名为李四
createMap := make(map[string]interface{})
createMap["phone"], createMap["name"], createMap["sex"] = "18300000000", "李四", 1
affectRows, err := DB("base").Table("auth_user").Filter("phone=?", "18300000000").Update(createMap)
1
2
3
4
查询
(1). 单条数据获取为Get,获取查询到的第一条数据,返回结果类型为map[string]interface{}
(2). 获取所有数据为All, 返回结果类型为[]map[string]interface{}
# 例如我要获取base库auth_user表中phone为18300000000的一条记录
userData := DB("base").Table("auth_user").Filter("phone=?", "18300000000").Get()
# 例如我要获取base库auth_user表中phone为18300000000的所有记录
userData := DB("base").Table("auth_user").Filter("phone=?", "18300000000").All()
# 例如我要获取base库auth_user表中phone为18300000000按照ID降序一条记录
userData := DB("base").Table("auth_user").Filter("phone=?", "18300000000").OrderBy("-id").Get()
1
2
3
4
5
6
多多件查询
# 例如我要获取base库auth_user表中phone为18300000000,sex为1的一条记录
userData := DB("base").Table("auth_user").Filter("phone=? AND sex=?", "18300000000", 1).Get()
1
2
分组方法查询
# 例如我要获取base库auth_user表中每个手机号为的统计数据
userData := DB("base").Table("auth_user").Select("phone", "COUNT(1) AS num").Filter("sex=?", 1).GroupBy("phone").All()
1
2
其他方法说明

Execute, 执行一条SQL,返回影响的行数和error信息.error为nil,表示执行成功
FetchOne, 执行一条SQL返回一条数据结果,返回结果类型为: map[string]interface{}
FetchAll, 执行一条SQL,返回多条数据结果,返回结果类型为: []map[string]interface{}
未实现方法

多表关联查询,建议通过书写原生SQL,然后使用FetchOne或FetchAll方法执行获取数据
---------------------

Golang操作MySQL的正确姿势的更多相关文章

  1. 转载 Python 操作 MySQL 的正确姿势 - 琉璃块

    Python 操作 MySQL 的正确姿势 收录待用,修改转载已取得腾讯云授权 作者 |邵建永 编辑 | 顾乡 使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能 ...

  2. Python 操作 MySQL 的正确姿势

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:邵建永 使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能是MyS ...

  3. [转帖]golang操作mysql使用总结

    golang操作mysql使用总结 https://www.cnblogs.com/hanyouchun/ 讲解的很详细~ 前言 Golang 提供了database/sql包用于对SQL数据库的访问 ...

  4. 59.phpstudy升级Mysql的正确姿势

    phpstudy升级Mysql的正确姿势 phpstudy很糟心,不能选择mysql的版本,所以就强制升级. 下载mysql 首先要到官网上去下载你想要的mysql版本. 下载网址:Mysql官网地址 ...

  5. golang操作mysql数据库

    golang操作mysql数据库 代码: mysql的增.删.改.查 package main import ( "database/sql" "fmt" &q ...

  6. golang操作mysql使用总结

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

  7. Golang 操作mysql使用举例---连接本地数据库

    连接数据库的方式有两种:TCP和Unix域socket. 本文使用Unix domain sockets连接数据库.关于TCP连接数据库可以参考Go 操作mysql使用举例 下面例子中,演示了使用sh ...

  8. Mysql学习(一)添加一个新的用户并用golang操作Mysql

    Mysql添加一个新的用户并赋予权限 添加一个自己的用户到mysql 首先我们需要先用root用户登录mysql,但是刚安装完没有密码,我们先跳过密码 ailumiyana@ailumiyana:~/ ...

  9. 阿里云centos7使用yum安装mysql的正确姿势

    yum快速安装mysql 新增yum源 rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm 查看可用的 ...

随机推荐

  1. Robotframework使用自写库连接mysql数据库

    Robotframework使用自写库连接mysql数据库 新建库文件mysqltest.py 代码如下: # -*- coding: utf-8 -*- import MySQLdbimport o ...

  2. c#处理json格式类型的字符串

    string channelGroup=[{"SpType":"1","BaseInfoId":["xxx"," ...

  3. Django first()和last() F查询以及Q查询

    一.first()和last() 分别返回queryset的第一项与最后一项,具体用法如下: p = Blog.objects.order_by('title').first() 等同于: try: ...

  4. Neo4j elk Elasticsearch kibana kettle

    图形数据库,用于查找犯罪或者啥的很好用:反欺诈 win安装neo4j使用查询https://www.cnblogs.com/rubinorth/p/5853204.html linux下安装neo4j ...

  5. 2019 最新 Java 核心技术教程,都在这了!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 ...

  6. P5030 长脖子鹿放置

    题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没 ...

  7. 2015 GDUT校赛

    周末打了个GDUT的校赛,也是作为SCAU的一场个人排位. 比赛中竟然卡了个特判,1个半钟就切了5条了,然后一直卡. 还有其他两条可以做的题也没法做了,性格太执着对ACM来说也是错呀. 讲回正题 . ...

  8. java中位运算^,&,<<,>>,<<<,>>>总结

    1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...

  9. Python_pickle

    pickle是一个可以将任意一个对象存储在硬盘文件中的工具. 更新:Python3中用法变了:  https://www.cnblogs.com/fmgao-technology/p/9078918. ...

  10. 【问题解决方案】Linux中进入目录下文件夹

    win系统中直接 cd+空格+文件夹名 Linux下 cd+空格+./+文件名 其中句点表示"当前目录" 除非在根目录不加,或者把路径写全用绝对路径进入 Linux下切换路径的相关 ...