简介

在 Go 中连接数据库的方式有很多, 这里我们选择使用 ORM 的方式, 也就不用写原生的 SQL 语句了.

Go 的 ORM 库也有很多, 这里选择了 gorm.

安装 gorm

go get -u github.com/jinzhu/gorm

启动数据库

数据库选择了最主流的 mysql.

创建数据库的方式有很多, 为了便于清理, 选择使用 docker 创建数据库.

新建一个 docker-compose.yml 文件, 在根目录下:

version:"3.7"services:mysql:image:mysql:8command:--default-authentication-plugin=mysql_native_passwordenvironment:MYSQL_ROOT_PASSWORD:1234ports:- 3306:3306adminer:image:adminer:4ports:- 8080:8080dbclient:image:mysql:8command:mysql -hmysql -uroot -p# source /home/script/db.sql# select * from tb_users \G;volumes:- ./script:/home/script

运行下面的命令在后台启动数据库:

docker-compose up -d mysql

使用下面的命令连接到 msyql 的 cli 上:

docker-compose run --rm dbclient

这会提示你输入密码, 密码是 1234 (在 mysql 的环境变量 MYSQL_ROOT_PASSWORD 中设置).

然后, 在 cli 中输入以下 SQL, 创建一个表格:

CREATE DATABASE IF NOT EXISTS `db_apiserver`;

接下来, 就可以完善 Go 代码了.

初始化数据库连接

在根目录下创建一个 model 文件夹, 这里定义数据模型, 以及数据库的初始连接.

在 model 目录下创建一个 init.go 文件, 用于初始化数据库连接.

package model

import (

"fmt"

"github.com/jinzhu/gorm"

_ "github.com/jinzhu/gorm/dialects/mysql"

"github.com/sirupsen/logrus"

"github.com/spf13/viper"

)

type Database struct {

Self *gorm.DB

}

// 单例var DB *Database

func (db *Database) Init() {

DB = &Database{

Self: GetDB(),

}

}

func (db *Database) Close() {

DB.Self.Close()

}

func openDB(username, password, addr, name string) *gorm.DB {

config := fmt.Sprintf(

"%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=%t&loc=%s",

username,

password,

addr,

name,

true,

// "Asia%2FShanghai", // 必须是 url.QueryEscape 的 "Local",

)

db, err := gorm.Open("mysql", config)

if err != nil {

logrus.Fatalf("数据库连接失败. 数据库名字: %s. 错误信息: %s", name, err)

} else {

logrus.Infof("数据库连接成功, 数据库名字: %s", name)

}

setupDB(db)

return db

}

func setupDB(db *gorm.DB) {

db.LogMode(viper.GetBool("gormlog"))

// 用于设置最大打开的连接数,默认值为0表示不限制.设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。 //db.DB().SetMaxOpenConns(20000) // 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。 db.DB().SetMaxIdleConns(0)

}

func InitDB() *gorm.DB {

return openDB(

viper.GetString("db.username"),

viper.GetString("db.password"),

viper.GetString("db.addr"),

viper.GetString("db.name"),

)

}

func GetDB() *gorm.DB {

return InitDB()

}

注意导入的时候, 需要导入对应的数据库驱动, mysql 需要如下的导入:

"github.com/jinzhu/gorm"

_ "github.com/jinzhu/gorm/dialects/mysql"

主要是定义了一个结构来保存数据库实例 *gorm.DB, 用到了单例模式:

type Database struct {

Self *gorm.DB

}

// 单例var DB *Database

然后定义了数据库的初始化方法和关闭方法.

打开的时候用到了配置文件中的参数, 需要在配置文件 config.yaml 中添加如下的参数:

db:name:db_apiserveraddr:127.0.0.1:3306username:rootpassword:"1234"

服务器启动时连接数据库

在 runServer 函数中添加下面的代码:

// 初始化数据库model.DB.Init()

defer model.DB.Close()

总结

其实连接数据库的问题并不太大, 以前觉得麻烦是因为在本地启动一个数据库麻烦, 但是在有了 docker 之后, 一切就变得简单可重复了, 再也不用担心兼容性了.

当前部分的代码

go mysql连接_使用 Go 连接数据库相关推荐

  1. 批量 杀掉 mysql 连接_批量杀死MySQL连接的几种方法

    方法一 通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令. mysql> select c ...

  2. 批量 杀掉 mysql 连接_批量杀死MySQL连接的四种方法详解

    方法一 通过information_schema.processlist表中的连接信息生成需要处理掉的MySQL连接的语句临时文件,然后执行临时文件中生成的指令.复制代码 代码如下:mysql> ...

  3. isql 测试mysql连接_[libco] 协程库学习,测试连接 mysql

    历史原因,一直使用 libev 作为服务底层:异步框架虽然性能比较高,但新人学习和使用门槛非常高,而且串行的逻辑被打散为状态机,这也会严重影响生产效率. 用同步方式实现异步功能,既保证了异步性能优势, ...

  4. sinaapp mysql连接_手把手教你在新浪云上免费部署自己的网站--连接数据库

    看完之后,默认你知道怎么将代码上传到新浪云SAE,并且能够成功运行,连接数据库之前,你必须先创建有一个应用. 现在我创建一个名称为sampleone的应用,如下图 点击左侧的代码管理,选在右侧创建一个 ...

  5. mysql workbench 连接_使用MySQLWorkBench连接数据库

    在日常使用中,经常使用命令行去连接MySQL数据库不方便,推荐使用MySQLWorkBench去远程连接进行管理,下面记录一下使用步骤: 1. 安装MySQLWorkBench后,界面如下,点击&qu ...

  6. 织梦如何与mysql连接_织梦dedecms,网站怎么搬家并成功连接数据库

    其实dede搬家比较头痛的是数据库的连接问题,说白了就是数据库连接不上,直接把原网站打包下载,在上传到新的空间中,根本就不管用,连网站的后 台就进不去,张江雷最近就遇到了同样的问题,网站是用dede程 ...

  7. 上位机和MYSQL连接_单片机接收到的数据如何通过上位机软件连接数据库?

    之前回答过一个类似问题,就是单片机如何跟电脑通信,有线的方式包括UART,usb,网线,无线的方式包括蓝牙和WIFI. 这个问题主要是给出上位机软件处理的方案.我之前做过这类的东西,把自己的经验跟大家 ...

  8. 应用程序 mysql 连接_学生信息管理系统之四:实现应用程序与数据库的连接

    我们通过JDBC实现Java应用程序与数据库的连接. 类ConnectionManagr完成与数据库的连接.关闭等基本操作. 1. 新建类文件ConnectionManagr.java,所属包为com ...

  9. c 工厂模式与mysql链接_工厂模式连接数据库

    在项目中通常可能会使用不同的数据源,可能是SQL Server也可能是ACCESS或者是Oracle,那么如何保证在使用不同数据源的时候,使项目代码更改的代价最小呢? 对,使用工厂模式.在Net1.1 ...

最新文章

  1. C#.net Winform获取文件路径
  2. WinCE上BINFS实现详解
  3. .net每隔几秒去请求接口 怎么做_C# .net 中 Timeout 的处理及遇到的问题
  4. Boost:bind绑定类型测试
  5. SAP UI5 xml view content parse
  6. js对象数组中的某属性值 拼接成字符串
  7. 微信小程序把玩(三十三)Record API
  8. 关于用java做微信机器人的艰辛过程
  9. 03-windows下Oracle的下载与安装
  10. Command line is too long. Shorten command line for Application---微服务升级_SpringCloud Alibaba工作笔记0067
  11. CoreData之增删改查
  12. sim7020c功耗_SIM7020C NB-IoT HAT教程
  13. 关于linux文件系统出现脏数据修复的思路
  14. 一文看懂什么是车规级芯片
  15. 【Python】数据处理之One-Hot编码
  16. b和kb的换算_KB换算
  17. word公式常用快捷键
  18. 俄罗斯计算机水平_从四点到三十二点。 俄罗斯计算机和网络的早期
  19. 2021年起重机司机(限桥式起重机)考试题库及起重机司机(限桥式起重机)考试试卷
  20. VLC编译错误难解 3 fatal error: features.h: 没有那个文件或目录

热门文章

  1. 基于 java的停车场智能管理系统
  2. python 大乐透号码生成器
  3. 数据库主键一定要自增吗?有哪些场景不建议自增?
  4. xgboost特征选择
  5. RK3568平台开发系列讲解(环境篇)瑞芯微RK3568亮点介绍
  6. Java集合(Collection)-小记02
  7. 自媒体运营入门基础知识,六大运营要素分享
  8. PADS Layout元器件独立规则设置
  9. 【Ogre编程入门与进阶】第十五章 Ogre的“二维”与合成特效
  10. 7-2 求幂级数展开的部分和 (20分)