Как сохранить модель Vapor Fluent с десятичным полем

#postgresql #vapor #vapor-fluent

#postgresql #vapor #vapor-fluent

Вопрос:

У меня есть Fluent ( Postgres поддержанная) модель, для которой требуется тип Decimal , но мне разрешено хранить только .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()
    }
}
 

Приведенная выше модель с миграцией завершится неудачей. Если это нелегко достижимо (так же просто, как .string или .double ), есть ли способ получить поведение, аналогичное типу Decimal Fluent ввода?

Комментарии:

1. В качестве обходного пути попробуйте сохранить его как .int в модели, выполнив всю свою арифметику с использованием этого типа данных, а затем создайте расширение для Int, которое сообщает об этом с правильной точностью.

2. Используйте Decimal для вашего era свойства модели и .string для earned_run_average миграции.

Ответ №1:

Недавно была добавлена правильная десятичная поддержка Postgres.

Таким образом, вы должны иметь возможность использовать Decimal Model для кодирования / декодирования Decimal значения в Postgres DB и обратно без каких-либо проблем.

Что касается Migration , все еще нет .decimal DataType so, вы можете просто использовать настраиваемое поле для базы данных Postgres, например numeric , так:

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

Это должно позволить вам использовать Decimal без каких-либо проблем.