go语言的相关进阶

74 阅读3分钟

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

模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成 GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间 遵循 GORM 已有的约定,可以减少您的配置和代码量。如果约定不符合您的需求,GORM 允许您自定义配置它们 GORM 基于 Golang build-in 的 database/sql 库进行扩展,增加了对面向对象编程更加友好的 ORM 机制。开发者只需要定义好 Struct 数据结构,由 GORM 来完成 Struct 到 ModelStruct 的转换(结构体映射为 Table,结构体成员映射为 Column),并提供了标准的方法进行数据操作,例如:Create、Update、Delete、Where 等。

GORM 的特点:

支持 MySQL、PostgreSQL、SQLite、SQLServer 等数据库。 支持 One to One、One to Many、Many To Many、Polymorphism(多态)等多种关联处理类型。 支持钩子(Hook)机制,可以在执行 Create、Save、Update、Delete、Find 操作之前或之后进行回调,具有良好的可扩展性。 支持复合主键:多个属性构成一个主键,常用作索引。 支持自动迁移(Auto-Migrtion)。 支持原生 SQL 操作。 支持链式 API。 支持热加载。 支持事务性。 支持日志。 GORM 的表定义很简单,应用了 Golang 的 Struct Tag 和 Reflect(反射)机制。我们用 “Model Struct” 来描述此类特殊的 ORM Struct。在定义好 Model Struct 之后,直接调用 db.CreateTable 函数就可以创建表了。 CRUD 操作 GORM 支持使用链式 API 来完成对 Table 的 CURD 操作,所有链式方法都会创建并克隆一个新的 db 对象 (共享一个连接池),GORM 在多 Goroutine 中是并发安全的。任何时候都可以不断的基于 db 对象调用函数来完成预期的操作,包括调用 db.Error 就能获取到错误信息。

db.Create 插入 调用 db.Create 方法即可完成数据库表记录的插入。需要注意的是,GORM 生成的 SQL 语句会排除零值字段:所有字段的零值,比如 0、’’、false,都不会保存到数据库内。将记录插入到数据库后,Gorm会从数据库加载那些字段的值到变量对象。 关系(Relationship)类型 总的来说,现实世界的实体之间拥有 3 种类型的关系:

一对多:表示一对多关系时,在子表中通过外键引用父表。 一对一:表示一对一关系时,本质是在两张表之间建立双向关系。一对一可以看作是特殊的 “一对多”,在双方看来,对方都是一对多的关系。 多对多:表示多对多关系时,表示两张表彼此都可以相互引用对方的多个记录。多对多关系会在两个表之间额外的增加一个关联的表。这个关联表通常只有两个属性,分别为另外两张表的外键。 而 GORM 基于这 3 种关系具现化为了更加实际的类型:Belongs To、Has One、Many To Many 等。在定义 Model Struct 的时,就可以设定这些实体之间的关系,GORM 会自定维护这些关系在数据库中的数据记录,例如:自动填充主键、外键之间的映射、自动维护多对多关联表等。