(gorm连接postgresql数据库)Gin学习笔记Day002

1,621 阅读1分钟

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{})

实际映射的数据库表字段

image.png

其中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) // 请求响应
})

image.png

查询单条

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)  
})

image.png

分页查询

关键是LimitOffsetLimit代表数量,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)  
})