Golang GORM入门

一、GORM入门


1.1 什么是ORM

orm 是一种术语而不是软件
  • orm英文全称object relational mapping,就是对象映射关系
  • 简单来说类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的
  • 为了保证一致的使用习惯,通过 orm将编程语言的对象模型和数据库的关系模型建立映射关系 这样我们直接使用编程语言的对象模型进行操作数据库就可以了,而不用直接使用sql语言

使用golang的orm框架就是将golang当中的struct,就是结构体和数据库当中的表字段进行一个映射。也就是操作数据库不是直接操作数据库了,而是通过结构体了。当然这里要使用数据库相关的sdk了。

总而言之就是操作结构体就能够操作数据库,操作结构体,那么表里面的数据其实也就会跟着发生变化。

orm框架主要的作用就是,在go里面就是struct,在java里面其实就是class类,也即是让对象和表产生一个映射关系,我们就不需要操作表了,直接操作对象就行了。

1.2 什么是GORM

参考文档: https://gorm.io/zh_CN/docs/index.html
GORM 是一个神奇的,对开发人员友好的 Golang ORM
  • 全特性 ORM (几乎包含所有特性)
  • 模型关联 (一对一, 一对多,一对多 (反向), 多对多, 多态关联)
  • 钩子 (Before/After Create/Save/Update/Delete/Find)
  • 预加载
  • 事务
  • 复合主键
  • SQL 构造器
  • 自动迁移
  • 日志
  • 基于GORM回调编写可扩展插件
  • 全特性测试覆盖
  • 开发者友好

1.3 GORM(v2)基本使用

1. 安装
go get -u gorm.io/gorm

2. 连接MySQL

先创建一个数据库

mysql> create database test_db charset utf8; # 创建数据库
mysql> use test_db; # 切换到数据库
mysql> show tables; # 查看是否生成表
+-------------------+
| Tables_in_test_db |
+-------------------+
| users |
+-------------------+
mysql> desc users; # 查看表的字段是否正常
+----------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| username | longtext | YES | | NULL | |
| password | longtext | YES | | NULL | |
+----------+------------+------+-----+---------+----------------+
创建 mysql 连接 ,参考文档: https://gorm.io/zh_CN/docs/connecting_to_the_database.html

如果导入的包是不使用的,那么在前面加上_,比如

import _"gorm.io/driver/mysql"

不使用这个包为什么还要导入呢?当我导入进来不使用的时候,说明包里面init函数是要执行的,其实就是执行里面的init。

parseTime解析时间:gorm里面自带一些创建时间,更新时间,删除时间。在做映射关系的时候拿到的时候是一个时间对象,这里就会自动转化为时间对象。

loc=Local:用本地环境的一个时区
package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	//这是固定写法
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic(err)
	}

	fmt.Println(db)
}
3. 自动创建表
参考文档: https://gorm.io/zh_CN/docs/models.html
其实开发当中不会使用这种,而是提前先创建好表,然后自己在数据库里面创建索引这些,而不是通过结构体标签来完成。
import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	Id       int64 `gorm:"primary_key" json:"id"`
	Username string
	Password string
}

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		fmt.Println(err)
	}

	//自动迁移
	err = db.AutoMigrate(User{})
	if err != nil {
		fmt.Println(err)
	}

}


mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)

mysql> desc users;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | bigint   | NO   | PRI | NULL    | auto_increment |
| username | longtext | YES  |     | NULL    |                |
| password | longtext | YES  |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

4. 基本增删改查  

package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)


//自定义返回表名
func (* User) TableName() string {
	return "user"
}



// User 表的结构体ORM映射
type User struct {
    Id int64 `gorm:"primary_key" json:"id"`
    Username string
    Password string
}

func main() {
// 0、连接数据库
    dsn := "root:1@tcp(127.0.0.1:3306)/test_db?
    charset=utf8mb4&parseTime=True&loc=Local"
    db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    db.AutoMigrate(User{})

    // 1、增
    db.Create(&User{
    //Id: 3,
    Username: "zhangsan",
    Password: "123456",
    })

    // 2、改
    db.Model(User{Id: 3,}).Update("username", "lisi")
    //db.Model(User{}).Where("id = 1").Update("username", "lisi")

    // 3、查
    // 3.1 过滤查询
    u := User{Id: 3}
    db.First(&u)
    fmt.Println(u)
    // 3.2 查询所有数据
    users := []User{}
    db.Find(&users)
    fmt.Println(users) // [{2 zhangsan 123456} {3 lisi 123456}]

    // 4、删
    // 4.1 删除 id = 3 的用户
    db.Delete(&User{Id: 3})
    // 4.2 条件删除
    db.Where("username = ?", "zhangsan").Delete(&User{})
}

上面所有使用到结构体的都和那张表有关系。

查询所有的数据。 

	var users []User
	db.Find(&users)
	fmt.Println(users)

二、模型定义


参考文档:https://gorm.io/zh_CN/docs/models.html

1. 模型定义
模型一般都是普通的 Golang 的结构体, Go 的基本数据类型,或者指针。
例子:

id这里其实就是一个主键,主键就是可以自增并且不能重复。

CreatedAt * time . Time `json:"createdAt" gorm:"column:create_at"`  你在创建的时候不需要传这个字段,你创建的时间会帮你自动加进去。在表里面创建的字段名叫 create_at。
建议在mysql里面将表创建好和设计好,然后再回过头来做gorm的操作。这些直接在数据库底层搞好就行了,不建议和上面一样写的乱七八糟。

2. 支持结构标签
标签是声明模型时可选的标记

上面这些直接在数据库里面限制死。

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/130039671