gorm是一个golang的orm框架;
如何用其连接postgresql数据库?(Mysql同理)
导入包:
import (
"gorm.io/driver/postgres" // 如果是mysql这个地方就是mysql的driver包
"gorm.io/gorm"
)
连接数据库:
dsn := "host=localhost user=postgres password=D+(d`bA'e#?P dbname=houqing port=5432 sslmode=disable"
database, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) // mysql的换成mysql
报错:
在连接过程中,出现了一个报错:
# gorm.io/driver/mysql
vendor/gorm.io/driver/mysql/migrator.go:224:24: cannot use column (type Column) as type gorm.ColumnType in append:
Column does not implement gorm.ColumnType (missing AutoIncrement method)
一直以为是密码搞错了,结果是driver库的版本太低; 参考Issue #5202
解决方法
升级driver包版本
go get gorm.io/gorm
go get gorm.io/driver/mysql
go get gorm.io/driver/postgres
go mod vendor
表自动映射
AutoMigrate自动将go的struct映射到表;
例如一个product表
type Product struct {
gorm.Model
Code string
Price uint
}
db.AutoMigrate(&Product{})
实际映射的数据库表字段
其中gorm.Model是gorm提供的一个基础struct
Package: gorm
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
CURD
新增数据(结合一个路由请求来演示)
router := gin.Default()
router.POST("product", func(c *gin.Context) {
var product Product
if err := c.BindJSON(&product); err != nil {
c.JSONP(http.StatusBadRequest, gin.H{"error": err.Error()}) // 获得前端传递的json
return
}
models.DB.Model(&Product{}).Create(&product) // 新增数据
c.JSONP(http.StatusOK, &product) // 请求响应
})
查询单条
router.GET("product/:id", func(c *gin.Context) {
id := c.Param("id")
var product Product
models.DB.First(&product, id)
c.JSONP(http.StatusOK, product)
})
分页查询
关键是
Limit和Offset,Limit代表数量,Offset代表偏移量,即从哪条数据开始查; 例如:Limtit(10).Offset(0)就是从第0个数据查询后面一共10条数据出来;
router.GET("products", func(c *gin.Context) {
var products []Product
page := c.DefaultQuery("page", "0")
pageInt, err := strconv.Atoi(page)
if err != nil {
pageInt = 0
}
size := c.DefaultQuery("size", "10")
sizeInt, err := strconv.Atoi(size)
if err != nil {
pageInt = 0
}
offset := pageInt * sizeInt
models.DB.Model(&Product{}).Limit(sizeInt).Offset(offset).Find(&products)
c.JSONP(http.StatusOK, products)
})