什么是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
}
- 默认使用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查询
- Struct & Map查询
- not or
- 内联条件
GORM CRUD指南 | 李文周的博客 (liwenzhou.com)