乐闻世界logo
搜索文章和话题

Go和Postgresql中带gorm的十进制类型

1 个月前提问
1 个月前修改
浏览次数15

1个答案

1

在Go中使用GORM与PostgreSQL数据库交互时,处理十进制类型(通常用于表示金钱或其他需要精确小数的数据)是一个常见的需求。在PostgreSQL中,十进制类型通常由DECIMALNUMERIC类型表示,这两种类型可以存储精确的数值,并允许指定精度(总位数)和标度(小数点后的位数)。

在Go中,由于语言本身并不直接支持十进制类型,我们通常会使用库如shopspring/decimal来处理需要高精度的十进制数。这个库提供了一个Decimal类型,用以支持高精度的算术运算。

然而,要在GORM中使用这种类型与PostgreSQL的DECIMALNUMERIC类型进行交互,我们需要做一些适配工作,以确保数据能够正确地从Go应用程序转移到数据库中,反之亦然。

例子

首先,你需要引入shopspring/decimal库:

go
import ( "github.com/shopspring/decimal" )

然后,定义你的模型。使用GORM定义模型时,你可以直接使用decimal.Decimal类型:

go
type Product struct { gorm.Model Price decimal.Decimal `gorm:"type:decimal(10,2);"` // 指定数据库中的列类型 }

在上面的代码中,Price字段被定义为decimal.Decimal类型,并通过gorm标签指定了相应的数据库列类型decimal(10,2),这意味着这个字段可以存储最多总共有10位的数字,其中小数点后有2位。

数据的读写

接下来,当你需要将数据写入数据库或从数据库读取数据时,GORM 和 shopspring/decimal 库能够很好地配合使用,不需要进行额外的数据转换:

go
func createProduct(db *gorm.DB, price decimal.Decimal) error { product := Product{Price: price} result := db.Create(&product) return result.Error } func getProduct(db *gorm.DB, id uint) (*Product, error) { var product Product result := db.First(&product, id) if result.Error != nil { return nil, result.Error } return &product, nil } // 示例:创建和获取产品 db, _ := gorm.Open(postgres.Open("dsn"), &gorm.Config{}) createProduct(db, decimal.NewFromFloat(99.99)) product, _ := getProduct(db, 1) fmt.Println("产品价格:", product.Price)

在上述示例中,我们创建了一个新的Product实例,设置了价格,然后保存到数据库中。之后从数据库获取这个产品的信息,并打印出价格。这个过程中,decimal.Decimal类型能够无缝地与PostgreSQL的DECIMAL类型对应,确保数据的精确性。

这样,你就可以在Go和PostgreSQL中使用GORM处理十进制类型了。这对于需要处理财务数据等需要高精度计算和存储的应用程序非常重要。

2024年8月12日 17:29 回复

你的答案