gorm

227 阅读3分钟

什么是gorm

ORM : object relational mapping

数据表----结构体

数据行---结构体实例

字段---结构体字段

  • 借助orm,可以提高开发效率,简化使用sql的复杂度。内部开发可以使用orm,但是追求性能还是要写sql

GORM示例

package main

import (
   "fmt"

   "github.com/jinzhu/gorm"
   _ "github.com/jinzhu/gorm/dialects/mysql"
)

//对应数据表
type UserInfo struct {
   ID     uint
   Name   string
   Gender string
   Hobby  string
}

func main() {
   //连接数据库
   dns := "root:root1234@tcp(192.168.80.129:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
   db, err := gorm.Open("mysql", dns)
   if err != nil {
      panic(err)
   }
   defer db.Close()

   //自动迁移
   db.AutoMigrate(&UserInfo{})

   //u1 := UserInfo{1, "li", "man", "篮球"}
   //u2 := UserInfo{2, "wang", "man", "足球"}

   //创建记录
   //db.Create(u1)
   //db.Create(u2)

   //查询 保存在指针u中 ,查询表中第一条
   var u = new(UserInfo)
   db.First(u)
   fmt.Printf("%#v\n", u)

   var uu UserInfo
   db.Find(&uu, "hobby=?", "篮球")
   fmt.Printf("%#v\n", uu)

   //更新
   db.Model(&u).Update("hobby", "双色球")
   ////删除
   db.Delete(&u)

}

mysql> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| user_infos    |
+---------------+
1 row in set (0.00 sec)

mysql> desc user_infos;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int unsigned | NO   | PRI | NULL    | auto_increment |
| name   | varchar(255) | YES  |     | NULL    |                |
| gender | varchar(255) | YES  |     | NULL    |                |
| hobby  | varchar(255) | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> select * from user_infos;
+----+------+--------+--------+
| id | name | gender | hobby  |
+----+------+--------+--------+
|  2 | wang | man    | 篮球   |
+----+------+--------+--------+
1 row in set (0.00 sec)

mysql> select * from user_infos;
+----+------+--------+--------+
| id | name | gender | hobby  |
+----+------+--------+--------+
|  1 | li   | man    | 篮球   |
|  2 | wang | man    | 篮球   |
+----+------+--------+--------+
2 rows in set (0.00 sec)

mysql> select * from user_infos;
+----+------+--------+--------+
| id | name | gender | hobby  |
+----+------+--------+--------+
|  1 | li   | man    | 篮球   |
|  2 | wang | man    | 篮球   |
+----+------+--------+--------+
2 rows in set (0.00 sec)

mysql> select * from user_infos;
+----+------+--------+-----------+
| id | name | gender | hobby     |
+----+------+--------+-----------+
|  1 | li   | man    | 双色球    |
|  2 | wang | man    | 篮球      |
+----+------+--------+-----------+
2 rows in set (0.00 sec)

mysql> select * from user_infos;
+----+------+--------+--------+
| id | name | gender | hobby  |
+----+------+--------+--------+
|  2 | wang | man    | 篮球   |
+----+------+--------+--------+
1 row in set (0.00 sec)

GORM model 定义

  • 通常我们需要在代码中定义模型(Models)与数据库中的数据表进行映射

  • 内置一个结构体gorm.model,可以把它嵌入自己的结构体

// gorm.Model 定义
type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}
// 将 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`字段注入到`User`模型中
type User struct {
  gorm.Model
  Name string
}

image.png

  • 默认使用id作为主键,也可以自己使用tag设置主键
mysql> desc users;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int unsigned | NO   | PRI | NULL    | auto_increment |
| created_at    | datetime     | YES  |     | NULL    |                |
| updated_at    | datetime     | YES  |     | NULL    |                |
| deleted_at    | datetime     | YES  | MUL | NULL    |                |
| name          | varchar(255) | YES  |     | NULL    |                |
| age           | bigint       | YES  |     | NULL    |                |
| birthday      | datetime     | YES  |     | NULL    |                |
| email         | varchar(100) | YES  | UNI | NULL    |                |
| role          | varchar(255) | YES  |     | NULL    |                |
| member_number | varchar(255) | NO   | UNI | NULL    |                |
| num           | int          | YES  |     | NULL    |                |
| address       | varchar(255) | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
12 rows in set (0.01 sec)

type Animals struct {
   Animalid int `gorm:"primary_key"`
   Name     string
}
  • 表明默认是复数,多个单词连接映射到数据库a_b,也可以自己设置
db.Table("lk").CreateTable(&User{})
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| animals       |
| lk            |
| lllli         |
| user_infos    |
| users         |
+---------------+
5 rows in set (0.00 sec)

  • 列名可以使用tag columu:更改

GORM创建记录

  • 定义model
  • model默认值,使用tag
type Person struct {
   ID   int
   Name string `gorm:"default:'小李'"`
   Age  int64
}
mysql> select * from people;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 小李   |   25 |
+----+--------+------+
1 row in set (0.01 sec)

show create table people;
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                                                              |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| people | CREATE TABLE `people` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT '小李',
  `age` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci   |
+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查询

  • 一般查询
//查询
var user User
db.First(&user)
fmt.Printf("user:%#v\n", user)
//查所有
var users []User
db.Find(&users)
fmt.Printf("user:%#v\n", users)
  • where查询

image.png

  • Struct & Map查询

image.png

  • not or

image.png

  • 内联条件

image.png

GORM CRUD指南 | 李文周的博客 (liwenzhou.com)

更新

删除