首页 > 解决方案 > 如何存储带有小数字段的 Vapor Fluent 模型

问题描述

我有一个需要 type的Fluent(支持的)模型,但我只能存储/ 。PostgresDecimal.float.double

// Model
final class Stat: Model, Content, Equatable {
    static let schema: String = "stats"
    
    @ID(key: .id)
    var id: UUID?
    
    @Field(key: "name")
    var name: String

    @Field(key: "earned_run_average")
    var era: Decimal // <-- CAN'T DO THIS
}
// Migration
struct CreateStatsTable: Migration {
    func prepare(on database: Database) -> EventLoopFuture<Void> {
        return database.schema(Stats.schema)
            .id()
            .field("name", .string, .required)
            .field("earned_run_average", .decimal/*.decimal TYPE DOES NOT EXIST */, .required)
            .create()
    }

    func revert(on database: Database) -> EventLoopFuture<Void> {
        return database.schema(Stats.schema).delete()
    }
}

上述带有迁移的模型将失败。如果这不容易实现(就像.stringor一样容易.double),有没有办法获得类似于 type Decimalin的行为Fluent

标签: postgresqlvaporvapor-fluent

解决方案


最近添加了对 Postgres 的适当十进制支持。

因此,您应该能够在 Postgres DB 中的值之间使用DecimalforModel编码/解码,而Decimal不会出现任何问题。

至于Migration,仍然没有,.decimal DataType因此您可以简单地为 Postgres 数据库使用自定义字段,如下所示numeric

.field("earned_run_average", .sql(raw: "NUMERIC(7,2)"), .required)

这应该允许您Decimal毫无问题地使用。


推荐阅读