首页 > 数据库 >Go操作数据库与Gorm

Go操作数据库与Gorm

时间:2023-12-23 11:05:09浏览次数:38  
标签:连接 数据库 mysql gorm user MySQL Go Gorm

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语句。表如下:

连接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 的基本数据类型、实现了 ScannerValuer 接口的自定义类型及其指针或别名组成

约定

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

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

gorm.Model

GORM 定义一个 gorm.Model 结构体,其包括字段 IDCreatedAtUpdatedAtDeletedAt

// 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

标签:连接,数据库,mysql,gorm,user,MySQL,Go,Gorm
From: https://blog.51cto.com/LowellHere/8944869

相关文章

  • 第一个Go 程序 Hello Go Lang
    GoLang的第一个程序IDEGoLang的IDE网上推荐的有很多,这里也整理了一些https://www.jetbrains.com/go/https://code.visualstudio.com/SublimeTextGoClipseLiteIDE个人用惯了VSCode,这里将继续使用打开VSCode安装插件写代码创建HelloWorld.gopackagem......
  • Go Lang 安装
    只针对windows安装下载下载地址:https://golang.google.cn/dl/ 下载msi文件进行安装这里下载的是go1.21.5.windows-amd64.msi安装和一般的软件安装一样,安装后重启环境变量就设置好了先检查一下安装是否成功如果goversion报错,可以到安装目录下运行该语句......
  • golang快速入门:并发编程(一)
    进程、线程和协程进程:是操作系统中的一个执行实体,它拥有独立的内存空间和系统资源。每个进程都是独立运行的,它们之间相互隔离,通过进程间通信(IPC)来进行数据交换。每个进程都有自己的地址空间、堆栈和文件描述符等。进程之间的切换开销较大,因为需要保存和恢复整个进程的状态。线程:是......
  • openGauss学习笔记-169 openGauss 数据库运维-备份与恢复-导入数据-更新表中数据-使用
    openGauss学习笔记-169openGauss数据库运维-备份与恢复-导入数据-更新表中数据-使用DML命令更新表openGauss支持标准的数据库操作语言(DML)命令,对表进行更新。169.1操作步骤假设存在表customer_t,表结构如下:CREATETABLEcustomer_t(c_customer_skinteger,......
  • #1 BanG Dream It's MyGolang!!!!!
    长期素食导致的-[pixiv111124804]睦头人(\(\mathrm{a\color{red}{ctypedef}}\)诱捕器)-[pixiv110897467]但是这其实是一篇正经的Golang上手简记,并不是MyGO简评(MyGO简评还在咕着(大概率不补了鉴于后端用go,有必要开展golang大学习references:Go语言圣经......
  • Spring JdbcTemplate操作数据库
    SpringJdbcTemplate操作数据库源码代码测试pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi......
  • Go实战篇 1
    猜谜游戏游戏通过程序生成一个随机数让玩家进行猜测,玩家输入一个数字后,程序给出提示:该数字是大于还是小于随机数,直至玩家猜对为止,退出程序。如何获得随机数?在Go中,使用math/rand包中的函数生成随机数,如下:funcmain(){ maxNum:=100 //用于指定随机数的上界 rand.Seed(tim......
  • 为什么cmd中输入数据库备份命令后还让继续输入
    为什么cmd中输入数据库备份命令后还让继续输入出现上述条件是需要进入mysql的bin目录下执行,在mysql中不可实现。我的mysql目录是在这这样就好了,在mysql登录状态下是不能够操作备份的。......
  • 成为阿里云云大使,推广阿里云数据库PolarDB产品,赢取猫超卡及返佣礼金!
    ......
  • 金蝶数据库服务器注册
    一、本地安装路径  K3Cloud\ManageSite\App_Data\DataBase\PatternDbFile 找到 SqlServerBCPatternDB.bak和  SqlServerMCPatternDB.bak 两个文件移动到数据库服务器目录下。二、使用ssms工具还原数据库 三、打开 K3Cloud\ManageSite\App_Data找到 Common.confi......