时隔两个月,终于又开始写文章了,这两个月母亲去世,去世前我辞职回家照顾,到后面办丧事等等一直都没碰过代码。今天入职了新公司,继续代码之路吧。
首先是什么是gorm,gorm是golang里的一个用来操作数据库的包,帮你集成了很多的数据库操作方法,还有一些比如钩子,关联等方法。然后postgresql是一种对象关系数据库系统,简单来说就是mysql的升级版,性能更加强大,运行更加稳定,字段类型更加丰富,就是学起来有点头秃,我也才刚开始学所以知道的不多。那么就开始学习gorm吧。
一.安装环境和软件就先跳过了。直接开始连接数据库
这是gorm的文档地址,https://gorm.io/zh_CN/docs/index.html
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
func main(){
//使用open函数连接postgresql数据库,第一个参数填数据库类型,后面的参数分别是数据库地址,端口,数据库名称,密码,是否ssl模式连接,时区
dsn := "host=127.0.0.1 port=5432 user=postgres dbname=postgres password=root sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
log.Println(err)
}
}
这样就连接上一个数据库了,那么我们继续,首先要操作数据库肯定得有一张表,那么我们现在开始定义表的模型,在项目目录下新建一个models文件夹,然后新建一个users.go文件,然后在里面定义一个模型
package models
import (
"time"
)
type Users struct {
Id int `json:"id" gorm:"column:id;unique;primaryKey;autoIncrement"`
Name string `json:"name" gorm:"column:name"`
Age int `json:"age" gorm:"column:age"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
}
//定义表名
func (Users) TableName() string {
return "users"
}
这里我们来说一下字段标签,字段标签指的是定义的字段后面那些unique,primaryKey等等,这里我直接上文档的连接https://gorm.io/zh_CN/docs/models.html#embedded_struct
定义好模型之后我们当然就是开始插入记录了,gorm的新增记录用的是Create方法。
func main() {
dsn := "host=127.0.0.1 port=5432 user=postgres dbname=postgres password=root sslmode=disable TimeZone=Asia/Shanghai"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
log.Println(err)
}
//将数据库里的表格和定义的模型结构体保持一致,如果数据库里没有表的话会自动创建表,如果是模型里有的字段,数据里没有也会自动新建,还有键、约束和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改的话)
db.AutoMigrate(&models.Users{})
a := &models.Users{Name: "测试", Age: 18}
result := db.Create(a)
log.Println(a.Id) // 返回插入数据的主键
log.Println(result.Error) // 返回 error
log.Println(result.RowsAffected) // 返回插入记录的条数
//批量插入
b := []models.Users{{Name: "测试1", Age: 19}, {Name: "测试2", Age: 20}, {Name: "测试3", Age: 21}}
result1 := db.Create(&b)
log.Println(b[0].Id) // 返回插入数据的主键
log.Println(result1.Error) // 返回 error
log.Println(result1.RowsAffected) // 返回插入记录的条数
}
运行结果
2021/09/24 15:22:04 23
2021/09/24 15:22:04 <nil>
2021/09/24 15:22:04 1
2021/09/24 15:22:04 24
2021/09/24 15:22:04 <nil>
2021/09/24 15:22:04 3
数据库里的数据
二.查找记录
主要使用Find函数,其他还有First,Last,Take函数
user := models.Users{}
users := []models.Users{}
// 查找第一条记录,主键升序
db.First(&user)
//查找最后一条记录
db.Last(&user)
result := db.First(&user)
fmt.Println(result.RowsAffected) // 返回找到的记录数
fmt.Println(result.Error) // returns error or nil
//如果主键是数字类型,可以直接用主键搜索
db.First(&user, 10)
// // SELECT * FROM users WHERE id = 10;
db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;
db.Find(&users, []int{1, 2, 3})
// SELECT * FROM users WHERE id IN (1,2,3);
这些就是基本的查询,然后是加上where条件的查询
//等于查询
db.Where("name = ?", "测试666").First(&user)
// 非等查询
db.Where("name <> ?", "jinzhu").Find(&users)
// IN查询
db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
// LIKE查询
db.Where("name LIKE ?", "%jin%").Find(&users)
// 多条件查询
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
// Time
lastWeek := "2021-09-23 10:57:00"
today := "2021-09-24 15:22:00"
db.Where("updated_at > ?", lastWeek).Find(&users)
// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)