• 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: GORM框架学习
  • 近期目标:写好专栏的每一篇文章

目录

  • 一、简介
    • 1.1:什么是ORM
    • 1.2:ORM的好处
    • 1.3:ORM缺点
  • 二、连接
    • 2.1:简单连接
    • 2.2:高级配置
      • 2.2.1:跳过默认事务
      • 2.2.2:命名策略

一、简介

1.1:什么是ORM

ORM的全称是:Object Relational Mapping(对象关系映射)

其中

  • 对象:指的是程序中对象/实例(在Go程序中就是结构体实例)
  • 关系:指的是关系型数据库(如Mysql)
  • 映射:也就是指程序中的对象、实例在数据库中的映射(这个实例映射到数据库中是某个实例)

结合上图再简单来说:

  • 一个类/结构体,对应数据库的一张表
  • 类/结构体的实例化,对应这张表的一条记录

1.2:ORM的好处

为什么要用到ORM呢?
将类的信息和实例,直接存储到数据库,手写SQL语句,不是也能进行操作吗?

的确可以,但是存在以下问题:

  1. 对象的属性名往往和数据表中的字段不一致,开发人员编写SQL语句要小心谨慎,一一核对,保证彼此互相对应
  2. SQL语句报错的提示信息不准确,排错难度大
  3. 不同数据库sql语句不完全相同
  4. sql注入问题1

相比,使用ORM,我们想要操作某个对象(这里对它进行操作,其实也连同它在数据中映射的数据也要被操作)。如果我们能用操作对象的方法,去操作数据库,那岂不是开发效率大大提升,没错!

1.3:ORM缺点

  1. 使用ORM技术,至少需要掌握一种ORM框架

    • python:SQLAlchemy,DjangoORM
    • Java:Hibernate, Mybatis
    • Golang:GORM
  2. ORM的底层是计算机自动帮我们生成对应的SQl语句,这会消耗计算机资源,对程序性能有影响
  3. 复杂数据库操作,ORM难以处理
  4. SQL语句自动生成的过程不能进行人工干预,灵活性差(开发人员无法定制一些特殊的SQL语句)

二、连接

先新创建一个Go项目

打开命令行,下载驱动和框架

go get gorm.io/driver/mysql
go get gorm.io/gorm


新建一个go文件,演示连接操作

2.1:简单连接

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc init() {username := "root"     //账号password := "55667788" //密码host := "127.0.0.1"    //数据库地址,可以是Ip或者域名(这里用的就是localhost,是一个回送地址,值本地机port := 3306           //数据库端口Dbname := "testdb"     //数据库名timeout := "10s"       //连接超时,10秒// root:root@tcp(127.0.0.1:3306)/gorm?dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。db, err := gorm.Open(mysql.Open(dsn))if err != nil {panic("连接数据库失败, error=" + err.Error())}// 连接成功fmt.Println(db)//把其DB类型实例赋给定义好的全局变量DB = db
}func main() {fmt.Println(DB)
}

2.2:高级配置

2.2.1:跳过默认事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这样可以获得60%的性能提升

可以看一下gorm.Open()源码:


// Open initialize db session based on dialector
func Open(dialector Dialector, opts ...Option) (db *DB, err error) {config := &Config{}sort.Slice(opts, func(i, j int) bool {_, isConfig := opts[i].(*Config)_, isConfig2 := opts[j].(*Config)return isConfig && !isConfig2})for _, opt := range opts {if opt != nil {if applyErr := opt.Apply(config); applyErr != nil {return nil, applyErr}defer func(opt Option) {if errr := opt.AfterInitialize(db); errr != nil {err = errr}}(opt)}}if d, ok := dialector.(interface{ Apply(*Config) error }); ok {if err = d.Apply(config); err != nil {return}}if config.NamingStrategy == nil {config.NamingStrategy = schema.NamingStrategy{}}if config.Logger == nil {config.Logger = logger.Default}if config.NowFunc == nil {config.NowFunc = func() time.Time { return time.Now().Local() }}if dialector != nil {config.Dialector = dialector}if config.Plugins == nil {config.Plugins = map[string]Plugin{}}if config.cacheStore == nil {config.cacheStore = &sync.Map{}}db = &DB{Config: config, clone: 1}db.callbacks = initializeCallbacks(db)if config.ClauseBuilders == nil {config.ClauseBuilders = map[string]clause.ClauseBuilder{}}if config.Dialector != nil {err = config.Dialector.Initialize(db)}preparedStmt := &PreparedStmtDB{ConnPool:    db.ConnPool,Stmts:       make(map[string]*Stmt),Mux:         &sync.RWMutex{},PreparedSQL: make([]string, 0, 100),}db.cacheStore.Store(preparedStmtDBKey, preparedStmt)if config.PrepareStmt {db.ConnPool = preparedStmt}db.Statement = &Statement{DB:       db,ConnPool: db.ConnPool,Context:  context.Background(),Clauses:  map[string]clause.Clause{},}if err == nil && !config.DisableAutomaticPing {if pinger, ok := db.ConnPool.(interface{ Ping() error }); ok {err = pinger.Ping()}}if err != nil {config.Logger.Error(context.Background(), "failed to initialize database, got error %v", err)}return
}

可以看到第二个参数是一个可变参数,可以传入相关配置option

这里我们传入:

&gorm.Config{SkipDefaultTransaction: true,
}

所以连接数据库语句可以写成:

db, err := gorm.Open(mysql.Open("gorm.db"), &gorm.Config{SkipDefaultTransaction: true,
})

2.2.2:命名策略

  • Go与数据库之间的对应关系
  • 建表->定义结构体
package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc init() {username := "root"     //账号password := "55667788" //密码host := "127.0.0.1"    //数据库地址,可以是Ip或者域名(这里用的就是localhost,是一个回送地址,值本地机port := 3306           //数据库端口Dbname := "testdb"     //数据库名timeout := "10s"       //连接超时,10秒// root:root@tcp(127.0.0.1:3306)/gorm?dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。db, err := gorm.Open(mysql.Open(dsn))if err != nil {panic("连接数据库失败, error=" + err.Error())}// 连接成功fmt.Println(db)//把其DB类型实例赋给定义好的全局变量DB = db
}// 1)定义一个结构体(在该数据库中创建一张表
type Student struct {ID   uintName stringAge  int
}func main() {//2)将该结构体指针传进去DB.AutoMigrate(&Student{})
}

gorm会根据以上建表操作,生成以下语句:

CREATE TABLE `students` (`name` longtext,`age` bigint,`my_student` longtext)
  • 命名策略:

    • 表名是蛇形复数
    • 表名是蛇形复数
  • 当然我们可以修改gorm的这种命名策略:

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{NamingStrategy: schema.NamingStrategy{TablePrefix:   "f_",  // 表名前缀SingularTable: false, // 单数表名NoLowerCase:   false, // 关闭小写转换},
})

但是以上建表方法有点麻烦,还可以用goland自带的可视化数据库管理工具进行建表等操作,如下

  • 建表

先在Goland软件中,进行数据库连接:

可视化查看表结构:

选中表,右键单击,modify


本文参考:http://docs.fengfengzhidao.com/#/docs/gorm%E6%96%87%E6%A1%A3/1.%E8%BF%9E%E6%8E%A5‘

欢迎在评论区交流和留下你的想法和建议

如果对你有用,还请:

【GORM框架】ORM介绍、GORM简单连接和高级配置详解相关推荐

  1. plsql如何配置连接oracle数据库,PLSQL连接Oracle 数据库配置详解

    (oracle官网下载地址:http://www.oracle.com/technetwork/topics/winsoft-085727.html , 下载地址2:http://download.c ...

  2. HikariCP连接池常用配置详解

    除了dadaSourceClassName/jdbcUrl.username.password这三个必须配置之外,HikariCP还有一些非必须配置,非必需配置包含的常用配置和非常用配置都是可选的.H ...

  3. 5G NR CSI-RS介绍(4)-- CSI Report配置详解

    笔者在微信公众号GiveMe5G定期发布学习文章(更多更及时),欢迎订阅和分享,文章下方有二维码. 配置CSI Report涉及的内容较多,也比较复杂.上一篇文章阐述了CSI Report配置的一部分 ...

  4. Druid 连接池的实用 配置详解

    Druid连接池参数配置详解 druid为阿里巴巴的数据源,(数据库连接池),集合了c3p0.dbcp.proxool等连接池的优点,还加入了日志监控,有效的监控DB池连接和SQL的执行情况. DRU ...

  5. Spring Boot 使用 HikariCP 连接池配置详解

    Spring Boot 使用 HikariCP 连接池配置详解 HikariCP 是一个高性能的 JDBC 连接池组件. Spring Boot 2.x 将其作为默认的连接池组件,项目中添加 spri ...

  6. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  7. SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解

    1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...

  8. keepalived介绍、安装及配置详解

    文章目录 keepalived简介 keeplived和LVS关系 VRRP工作原理 keepalived体系结构及工作原理 keepalived安装 keepalived配置详解 keepalive ...

  9. 【笔记】spring的注解回顾,springboot-restful项目结构介绍 springboot-freemarker ⼯程配置详解

    注解 学Spring boot有一阵子了,总结一下它的注解. @Controller :修饰class,⽤来创建处理http请求的对象 @RestController :Spring4之后加⼊的注解, ...

最新文章

  1. html语言书写注意事项,CSS命名规范参考及书写注意事项
  2. 制做任意大小的bmp,并在其中写汉字
  3. Jquery 禁用元素的所有属性
  4. SAP C4C里销售订单行项目为什么无法添加产品
  5. Linux解决 -bash: nc: command not found问题,安装nc
  6. Java Base64 编码解码方案总结
  7. 去除小圆点_去除li小圆点以及解决其空格问题
  8. 基于机器视觉的洋葱霜霉病症状自动检测
  9. Matlab函数之lower函数与upper函数
  10. 想测一下接口的并发数?手把手教你!
  11. 数据库架构 - 数据库设计是否要使用外键(转)
  12. PMP的含金量价值主要表现在哪些方面?
  13. html表格中加入斜线,Html Table 表格 画斜线
  14. oracle blob 24909,imp导入含blob字段的大表时不成功
  15. net_device_ops的ndo_open和ndo_start_xmit函数
  16. 荷包app软件测试,智能分贝测试仪app
  17. Android 性能优化之网络优化
  18. 朋友圈集赞神器!再也不怕谁让集赞了
  19. 石墨笔记,为知笔记和Effie哪个更适合学生?
  20. Apollo planning之PiecewiseJerkPathOptimizer

热门文章

  1. BIM模型文件下载——热交换机机房模型
  2. nginx反向代理的断连问题
  3. nginx配置php域名访问,nginx+php+composer+git+域名配置+项目访问
  4. java jframe面板美化,Java-JFrame窗体美化
  5. Linux 切换到root用户
  6. (四)ioctl函数的使用
  7. JS 基本函数 数学函数
  8. oracle数据库单表查询相关练习题及答案写法
  9. 数据库 查询计算机系姓王,数据库上机实验报告——SQL Server 2008 简单查询.doc
  10. 开源炫酷日历、网页日历模板、自适应大小日历、win10日历