SQLの数値型をPrismaのInt、Float、Decimal、BigIntにマッピングする
SQL INTEGER、BIGINT、DECIMAL、FLOAT、DOUBLE PRECISIONカラムが、ネイティブデータベースアノテーション付きのPrisma数値スカラー型にどのように変換されるかを学びます。
詳細な説明
数値型のマッピング
SQLには、異なる範囲と精度を持つ豊富な数値型のセットがあります。Prismaは4つの数値スカラー型を提供しています:Int、BigInt、Float、Decimal。コンバーターはSQLのカラム定義に基づいて適切な型を選択します。
SQLの例
CREATE TABLE products (
id SERIAL PRIMARY KEY,
quantity INTEGER NOT NULL DEFAULT 0,
views BIGINT NOT NULL DEFAULT 0,
price DECIMAL(10, 2) NOT NULL,
weight DOUBLE PRECISION,
rating REAL
);
生成されるPrismaスキーマ
model Product {
id Int @id @default(autoincrement())
quantity Int @default(0)
views BigInt @default(0)
price Decimal @db.Decimal(10, 2)
weight Float? @db.DoublePrecision
rating Float? @db.Real
@@map("products")
}
型マッピング表
| SQL型 | Prisma型 | 備考 |
|---|---|---|
INTEGER / INT |
Int |
32ビット符号付き整数 |
SMALLINT |
Int |
@db.SmallIntアノテーション |
BIGINT / BIGSERIAL |
BigInt |
64ビット、JSONでは文字列としてシリアライズ |
DECIMAL(p,s) / NUMERIC(p,s) |
Decimal |
金額用の正確な精度 |
REAL / FLOAT4 |
Float |
@db.Real — 32ビット浮動小数点 |
DOUBLE PRECISION / FLOAT8 |
Float |
@db.DoublePrecision — 64ビット |
MONEY |
Decimal |
PostgreSQL固有 |
金額にはDecimalを使用
金額には常にDecimal(Floatではなく)を使用してください。浮動小数点演算は、多くのトランザクションにわたって蓄積される丸め誤差を引き起こします。PrismaのDecimal型はクライアントでJavaScriptのDecimal.jsインスタンスにマッピングされ、正確な演算を提供します。
price Decimal @db.Decimal(10, 2)
discount Decimal @db.Decimal(5, 2)
tax Decimal @db.Decimal(10, 2)
BigIntのシリアライゼーション
BigIntフィールドはJSONで文字列としてシリアライズされます。これはJavaScriptのNumberが2^53 - 1より大きい整数を安全に表現できないためです。PrismaクライアントでBigInt値を消費する際は、APIレスポンスでの文字列表現の処理を忘れないでください。
デフォルト値
数値のデフォルトは直接マッピングされます:
| SQLのデフォルト | Prismaのデフォルト |
|---|---|
DEFAULT 0 |
@default(0) |
DEFAULT 1.5 |
@default(1.5) |
DEFAULT nextval('seq') |
@default(autoincrement()) |
符号なし整数(MySQL)
MySQLはUNSIGNED整数をサポートしています。Prismaにはネイティブの符号なし型がないため、コンバーターはデータベース制約を保持するために@db.UnsignedInt、@db.UnsignedBigIntなどを使用します。
ユースケース
金融アプリケーションのSQLスキーマを変換する場合、価格にDECIMAL(10,2)、分析カウンターにBIGINT、測定値にDOUBLE PRECISIONが使用されています。コンバーターはそれぞれを精度と範囲を保持した正しいPrisma型にマッピングします。