SQL与GORM实践 | 青训营笔记

232 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

database/aql

  • 基本用法 GORM是一种对象关系映射ORM框架,数据表对应结构体,数据行对应结构体实例,数据库字段对应结构体字段。

在gorm中,表名默认就是结构体名称的复数,也可以通过方法或者db.Table("表名")自定义表名;

列名由两个单词组成,在数据库中默认转小写后用下划线链接;

如果结构体有ID字段则默认ID字段为主键。

  • 设计原理

    • //比较新的创建连接的操作
      type Connector interface {
      Connect(context.Context) (Conn.error)
      Driver() Driver
      }
      func main() {
      connecter,err := mysql.NewConnector(&mysql.Config{
      User: "root",
      Password : "123456",
      Net : "tcp",
      Addr :" 127.0.0.1:3306",
      DBName:"gorm",
      ParseTime:true,
      })
      db := sql.OpenDB(cobbector)
      }
      
  • DB连接的几种类型

    • 直接连接
    • 预编译
    • 事务
  • 处理返回数据的几种方式

    Exec /ExecContext - > Result
    Query/QueryContext -> Rows(Columns)
    QueryRows/QueryRowContext - > Row(Row简化)

Gorm的基本使用

  • 设计简洁,功能强大,自由扩展的全功能ORM

  • 基本用法

    //操作数据库
    db.AutoMigrate(&Profuct{})
    db.Migrator().Create(&Product{})
    //创建
    user := UserName{Name:"zhang",Age:"20",Birthday:time.Now}
    result := db.Create(&user)
    //批量创建
    var users = []User{{Name:"1"},{Name:"2"},{Name:"3"}}
    db.Create(&users)
    db.CreateInBarches(users,100)
    
  • 模型定义--管理规定

  • 关联操作 - 级联删除

    级联删除,不依赖数据库约束及软删除 模型名和表名的映射关系 规则 第一个大写字母变为小写; 遇到其他大写字母变为小写并且在前面加下划线; 连着的几个大写字母,只有第一个遵循上面的两条规则,其他的大写字母转为小写,不加下划线,遇到小写,前面的第一个大写字母变小写并加下划线; 复数形式; 举例 User => users 首字母小写,复数 UserInfo => user_infos DBUserInfo => db_user_infos DBXXXXUserInfo => dbxxxx_user_infos

GORM设计原理

  • GORM相当于在应用程序和database/sql之间再加上一层

  • Chain Method Chain Method

  • SELECT Statement

  • SELECT FROM WHERE FROUP BY ORDER BY LIMIT FOR

  • 插件是怎么工作的

    • 1Finisher Method

    • 2 决定Statement类型

    • 3 执行Callbacks

    • 4生成SQL并执行

    灵活定制 自由拓展 多租户 多数据库,读写分离,加解密,混沌工程 Connpool 是一个接口,和数据库进行交互,可以实现读写分离,事务,数据库 DB Conn 数据库

全局模式,所有的DB操作都会预编译并缓存 会话模式,后续会话的操作都会预编译并缓存 数据安全,ConnPool不能直接到数据库,可以扩展,可以完成各个数据库之间的中转。 GORM 使用 database/sql 的参数占位符构造 SQL 语句,会自动转义参数以避免 SQL 注入,但生成的 SQL 不提供安全保证,请仅用于调试。 # 提升性能 interploateParams=false 是预编译,但是编译之后就会丢掉 执行时间可以节省三分之一 1 执行钱预编译SQL 2 调用预编译的SQL 3 关闭预编译的SQL

Dialector

  • 定制SQL生
  • 定制GORM插件
  • 定制ConnPool
  • 定制企业特性逻辑
  • 默认配置,拓展