这是我参与「第五届青训营 」笔记创作活动的第7天
1.什么是架构
SOA:
1.将应用的不同功能单元抽象为服务
2.定义服务之间的通信标准
微服务架构:SOA的去中心化演进方向
2.企业级后端架构剖析
云计算:是指通过软件自动化管理,提供计算资源的服务网络,是现代互联网大规模熟悉分析和存储的基石
基础:
虚拟化技术
编排方案
架构
IaaS、PaaS、SaaS、FaaS
通信标准:
HTTP、RPC
其他
ORM 框架 Gorm 初体验
安装gorm
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作为主键,使用结构体的蛇形复数作为表名,字段名的蛇形作为列名,并使用CreatedAt、UpdatedAt字段追踪创建、更新时间
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"`
}
字段权限
GORM允许我们使用标签来控制字段的权限,如图
字段标签
声明 model 时,tag 是可选的,GORM 支持以下 tag:tag 名大小写不敏感,但建议使用 camelCase 风格,标签也就是字段后面的内容,如图:
与数据库建立连接,官方支持的数据库有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&...¶mN=valueN]
涉及的一些参数
//username 数据库账号
//password 数据库密码
//host 数据库连接地址,可以是Ip或者域名
//port 数据库端口
//Dbname 数据库名
自己的mysql:(以免又忘记)
username:root
password:123456
目前已经有的数据库
连接成功啦
开始创建
创建一条数据记录(通过数据结构体指针来创建)
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)
选定字段创建
选中结构体中的部分字段来在数据库中创建数据,代码
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