架构初探 - 谁动了我的蛋糕&GORM初体验|青训营笔记

48 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第7天

1.什么是架构

image.png

SOA:

1.将应用的不同功能单元抽象为服务

2.定义服务之间的通信标准

微服务架构:SOA的去中心化演进方向

2.企业级后端架构剖析

云计算:是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模熟悉分析和存储的基石

基础:

虚拟化技术

编排方案

架构

IaaS、PaaS、SaaS、FaaS

通信标准:

HTTP、RPC

image.png

其他

ORM 框架 Gorm 初体验

安装gorm

image.png

1.模型定义

其实就是定义一个结构体,也对应着数据库中的字段,如下

type User struct {
  ID           uint
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivedAt    sql.NullTime
  CreatedAt    time.Time
  UpdatedAt    time.Time
}

约定

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

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

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

字段权限

GORM允许我们使用标签来控制字段的权限,如图

image.png

字段标签

声明 model 时,tag 是可选的,GORM 支持以下 tag:tag 名大小写不敏感,但建议使用 camelCase 风格,标签也就是字段后面的内容,如图:

image.png

与数据库建立连接,官方支持的数据库有MySQL\SQLlite\SQL Server等

与MySQL的连接

代码:

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)
​
func main() {
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  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{})
}

连接MySQL数据库主要有两个步骤:

1.配置DSN(数据源)

2.使用gorm.Open连接数据库

配置DSN

gorm库使用dsn作为连接数据库的参数,dsn翻译过来就叫数据源名称,用来描述数据库连接信息。一般都包含数据库连接地址,账号,密码之类的信息

DSN格式

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

涉及的一些参数

//username   数据库账号
//password   数据库密码
//host       数据库连接地址,可以是Ip或者域名
//port       数据库端口
//Dbname     数据库名
自己的mysql:(以免又忘记)
username:root
password:123456

目前已经有的数据库

image.png

连接成功啦

image.png

开始创建

创建一条数据记录(通过数据结构体指针来创建)

user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
​
result := db.Create(&user) // 通过数据的指针来创建
​
user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

1.连接到数据库

2.在连接到的数据库中创建特定的数据表(对应结构体)

具体代码

  // 迁移 schema
  db.AutoMigrate(&User{})

3.尝试插入数据

代码:

user := User{Name: "Jinzhu", Age: 18}
result := db.Create(&user)

image.png

选定字段创建

选中结构体中的部分字段来在数据库中创建数据,代码

db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775")

能选出一些,当然也能剔除一些字段后再创建

db.Omit("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775")

创建钩子

GORM 允许 BeforeSave, BeforeCreate, AfterSave, AfterCreate 等钩子,创建记录时会调用这些方法

啥是钩子?

使用钩子,我们在创建记录时候会自动调用这些方法,如图就是一个作用很显然是方法

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
  u.UUID = uuid.New()
​
    if u.Role == "admin" {
        return errors.New("invalid role")
    }
    return
}

Hook(钩子)

Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数

如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务,即可以帮助我们在curd过程中执行一些逻辑

钩子方法的函数签名应该是 func(*gorm.DB) error

gorm连接mysql数据库 - 走看看 (zoukankan.com)