#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
без каких-либо проблем.