SQLの数値型をPrismaのInt、Float、Decimal、BigIntにマッピングする

SQL INTEGER、BIGINT、DECIMAL、FLOAT、DOUBLE PRECISIONカラムが、ネイティブデータベースアノテーション付きのPrisma数値スカラー型にどのように変換されるかを学びます。

Field Types

詳細な説明

数値型のマッピング

SQLには、異なる範囲と精度を持つ豊富な数値型のセットがあります。Prismaは4つの数値スカラー型を提供しています:IntBigIntFloatDecimal。コンバーターは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を使用

金額には常にDecimalFloatではなく)を使用してください。浮動小数点演算は、多くのトランザクションにわたって蓄積される丸め誤差を引き起こします。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のNumber2^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型にマッピングします。

試してみる — SQL to Prisma Schema

フルツールを開く