Skip to main content

Introduction

数据模型

数据库是数据表的集合,例如一个数据库可以有用户表、产品表、订单表等,而数据(表)模型是基于编程语言层面上的描述数据表结构的一种方式。

数据模型存在的意义是:有ORM库需要编程语言来描述数据表,根据这个描述对数据表进行数据的增删改查。

要对数据表的数据进行增删改查,传统的方式是通过SQL语言进行操作,但是随着业务越来越复杂,SQL语句也变得越来越复杂,传统方式的弊端也越来越明显,ORM由此逐渐出现。

ORM

ORM(Object Relational Mapping),即对象关系映射。

type User struct {
Id uint
Username string
Password string
}

/**
id usernane password
1 Tom 123456
2 Lily 1234567
*/

SQL语句比较难以编写与维护,而ORM封装了一套基于编程语言的操作数据库的方法集合。

ORM的出现使得开发方便高效、代码整洁易读,但也带来一些性能问题(最终仍然会转换成SQL语句),过度地依赖ORM会导致对SQL语句理解困难。

Gorm

Gorm是Go语言的ORM库,提供了各种功能:

  • 全功能ORM。
  • 关联 (拥有一个,拥有多个,属于,多对多,多态,单表继承)。
  • Create,Save,Update,Delete,Find中钩子方法。
  • 支持 Preload、Joins的预加载。
  • 事务,嵌套事务,Save Point,Rollback To to Saved Point。
  • Context、预编译模式、DryRun 模式。
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD。
  • SQL 构建器,Upsert,锁,Optimizer/Index/Comment Hint,命名参数,子查询。
  • 复合主键,索引,约束。
  • 自动迁移。
  • 自定义 Logger。
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus等。
  • 每个特性都经过了测试的重重考验。
  • 开发者友好。

安装

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

连接

package main

import (
"fmt"
"log"
"os"
"time"

"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)

var newLogger = logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second,
LogLevel: logger.Silent,
IgnoreRecordNotFoundError: true,
ParameterizedQueries: true,
Colorful: false,
},
)

func main() {
dsn := "root:12345678@tcp(127.0.0.1:3306)/golang?charset=utf8mb4&parseTime=True&loc=Local"

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: newLogger,
})

if err != nil {
panic(err.Error())
}

fmt.Println(db)
}