0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Golang连接MySQL

马哥Linux运维 来源:51CTO 2024-01-08 09:42 次阅读

Go连接MySQL

首先我们来看如何使用Golang连接MySQL

安装所需要的驱动

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

导入所需要使用的包

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

连接MySQL需要使用的语句

func main() {
    //"用户名:密码@[连接方式](主机名:端口号)/数据库名"
    db, _ := sql.Open("mysql", "root:pwd@(localhost)/database") // 设置连接数据库的参数
    defer db.Close()                                            //关闭数据库
    err := db.Ping()                                            //连接数据库
    if err != nil {
        fmt.Println("Open database fail !")                             //连接失败
        return
    }
    fmt.Println("Connection succdess !")                             //连接成功
}

案例演示

建表

先在MySQL中创建一个名为test的数据库,在此数据库中创建一个user表,包含五个字段id, name, age, sex, phone,并插入几条数据,推荐使用 Navicat等图形化管理工具,不用麻烦地在 MySQL 命令行写SQL语句。表如下:

1bae6982-ad48-11ee-8b88-92fbcf53809c.jpg

连接MySQL

将数据库的相关配置写成常量,创建InitDB函数用于连接数据库,创建Query函数用于查询数据,全部代码如下:

package main


import (
  "database/sql"
  "fmt"
  _ "github.com/go-sql-driver/mysql"
  "github.com/pkg/errors"
  "strings"
)


// 数据库配置
const (
  userName = "root"
  password = "******"
  ip       = "127.0.0.1"
  port     = "3306"
  dbName   = "test"
)


// Db数据库连接池
var DB *sql.DB


type User struct {
  id    int64
  name  string
  age   int8
  sex   int8
  phone string
}


// 注意方法名大写,就是public
func InitDB() {
  //构建连接:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8"
  path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
  //打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql"
  DB, _ = sql.Open("mysql", path)
  //设置数据库最大连接数
  DB.SetConnMaxLifetime(100)
  //设置上数据库最大闲置连接数
  DB.SetMaxIdleConns(10)
  //验证连接
  if err := DB.Ping(); err != nil {
    fmt.Println("open database fail !")
    return
  }
  fmt.Println("connnection success !")
}


// 查询操作
func Query() {
  var user User
  rows, e := DB.Query("select * from user where id in (1,2,3)")
  if e == nil {
    errors.New("query incur error")
  }
  for rows.Next() {
    e := rows.Scan(&user.sex, &user.phone, &user.name, &user.id, &user.age)
    if e != nil {
      fmt.Println(user.sex, user.phone, user.name, user.id, user.age)
    }
  }
  rows.Close()
}


func main() {
  InitDB()
  Query()
  defer DB.Close()
}

以上是使用Golang连接MySQL数据库的基础方法,接下来我们看Gorm是如何连接MySQL。

Gorm

什么是ORM

对象关系映射 :Object-Relational Mapping,用于在关系数据库和面向对象编程语言的堆之间转换数据。这样就创建了一个虚拟的对象数据库,可以从编程语言内部使用。

ORM提供了自动支持,用于将元组映射到对象并返回,同时考虑所有这些差异。问题的核心在于将对象的逻辑表示转换为能够存储在数据库中的原子形式,同时保留对象的属性和它们之间的关系,以便在需要时可以重新加载为对象。如果实现了这种存储和检索功能,则称这些对象是持久的。

优点

提高开发效率,减少开发成本

使开发更加面向对象

可移植性

可以轻松引入额外功能,如数据缓存。

加快开发速度 - 消除了重复的SQL代码的需要。

减少开发时间、成本

克服特定于供应商的SQL差异 - ORM知道如何编写特定于供应商的SQL

缺点

在学习使用ORM时会损失生产力

失去了对代码实际执行内容的理解 - 使用SQL时,开发人员更能控制

ORM有变慢的倾向

ORM无法与复杂查询的SQL查询竞争

Grom介绍

Gorm是一种功能强大且对开发人员友好的ORM库,支持主流的数据库。

GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

连接MySQL

和基本的连接方法区别不大

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)


func main() {
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

**注意:**想要正确的处理time.Time,您需要带上parseTime参数, (更多参数) 要支持完整的 UTF-8 编码,您需要将charset=utf8更改为charset=utf8mb4查看此文章获取详情

GORM MODEL 定义

在使用ORM工具时,我们需要在代码中定义模型(Models)与数据库中的数据表进行映射,模型是标准的 struct,由 Go 的基本数据类型、实现了Scanner和Valuer接口的自定义类型及其指针或别名组成

约定

GORM 倾向于约定优于配置 默认情况下,GORM 使用ID作为主键,使用结构体名的蛇形复数作为表名,字段名的蛇形作为列名,并使用CreatedAt、UpdatedAt字段追踪创建、更新时间

如果您遵循 GORM 的约定,您就可以少写的配置、代码。如果约定不符合您的实际要求, GORM 允许你配置它们

gorm.Model

GORM 定义一个gorm.Model结构体,其包括字段ID、CreatedAt、UpdatedAt、DeletedAt

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

您也可以将其嵌入到自己的结构体当中,如下:

type User struct {
  gorm.Model
  Name string
}
// 等效于
type User struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
  Name string
}

当然您也可以完全使用自己定义的结构体,不一定需要使用它的model

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3591

    浏览量

    63369
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61308
  • MySQL
    +关注

    关注

    1

    文章

    775

    浏览量

    26003
  • GitHub
    +关注

    关注

    3

    文章

    457

    浏览量

    15920

原文标题:Go操作数据库与Gorm讲解

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在Rust中连接和使用MySQL数据库

    如何在Rust中连接和使用MySQL数据库。 安装 mysql 模块 这里我们假设你已经安装了Rust编程语言工具链,在本教程中,我们将使用 mysql crate来
    的头像 发表于 09-30 17:05 915次阅读

    labview 连接mysql 数据库的问题

    `我根据网络上的教程想用labsql 做个连接mysql的vi,但是就是连接不上数据库。(已经新建数据源DSN)求教下,字符串 3,4 是不是哪里写错了? 后面的程序部分有问题吗?本人初学,谢谢DSN=mysqldriver是
    发表于 01-07 22:06

    labview连接mysql数据库失败,原因何在。

    `使用ODBC连接mysql时,测试连接成功;但是使用labview连接mysql时,测试连接
    发表于 11-29 17:02

    采用hqC连接mysql数据库

    eclipse连接mysql(80)的版本问题
    发表于 04-30 10:27

    Labview连接Mysql学习笔记分享

    论坛上有很多分享Labview与access连接的资料。但是对于MySQL则比较少,尤其是连接远程的MySQL.MySQL由于其免费性和高效性,被广泛使用。学会如何
    发表于 06-04 16:27

    Golang怎么实现UTS隔离

    Golang实现UTS隔离
    发表于 08-23 14:44

    Golang调用MySQL存储过程解析

    Golang 调用MySQL存储过程
    发表于 06-05 17:42

    c#如何连接mysql数据库

    (visual studio)c#连接mysql数据库
    发表于 06-13 20:56

    python如何连接MySql数据库

    Python入门(python连接MySql数据库)还能怎么记,大开眼界!
    发表于 06-14 07:48

    mysql数据导出golang实现

    mysql数据导出为excel文件,golang实现:首先下载依赖到的三方库:Simple install the package to your $GOPATH
    发表于 10-21 15:14

    ESP8266如何连接mysql数据库

    各位大神,我试图用ESP8266 连接mysql ,将温湿度传感器的数据,写入数据库。mysql数据库已建好,在局域网中的其他电脑也可以正常访问;Arduino中是有mysql con
    发表于 01-12 09:22

    初探Golang内联

    今天我们来聊聊 Golang 中的内联。
    的头像 发表于 12-13 09:51 616次阅读

    GoLang的安装和使用

    GoLang的安装和使用
    的头像 发表于 01-13 14:06 1032次阅读
    <b class='flag-5'>GoLang</b>的安装和使用

    一个快速应用程序开发(RAD)工具(Golang版)

    SNMPAgent Builder(Golang版)是一个快速应用程序开发(RAD)工具,用于基于Golang 的 SNMP代理开发。提供了一个直观的图形用户界面,用于自动执行各种SNMP 代理开发任务
    的头像 发表于 04-13 09:30 1089次阅读

    eclipse怎么连接数据库mysql

    连接Eclipse和MySQL数据库可以通过JDBC(Java Database Connectivity)来实现。以下是详细步骤: 下载并安装MySQL数据库:你首先需要下载并安装MySQL
    的头像 发表于 12-06 11:06 452次阅读