コンテンツにスキップ

Prismaスキーマとフィールドの型

Accellaではスキーマ定義にPrismaを利用していますが、各機能のサポート状況は以下の通りです。

機能記法サポート
ID@id
Multi-field ID (Composite ID)@@id
Table name mapping@@map
Column name mapping@map
Default value@default
Updated at@updatedAt
List[]
Optional?
Relation field
Implicit many-to-many relations
Enumsenum
Unsupported typeUnsupported-

フィールドタイプが必須の場合とオプションの場合で、NewModelとPersistedModelの型が異なります。

typeNewModelPersistedModel
Required FieldNullableNonNullable
Optional FieldNullableNullable

また、デフォルト値の指定方法によってもNewModelとPersistedModelの型が異なります。

argNewModelPersistedModel
static valueNonNullableNonNullable
autoincrement()NullableNonNullable
now()NullableNonNullable
dbgenerated()NullableNonNullable
uuid()NonNullableNonNullable
cuid()NonNullableNonNullable

以下に、モデル定義とそれに対応するNewModelとPersistedModelの例を示します。

prisma/schema.prisma
model Sample {
id Int @id @default(autoincrement())
required Int
optional String?
hasDefault Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
uuid String @default(uuid())
cuid String @default(cuid())
}
// NewModel
interface NewSample {
id: number | undefined;
required: number | undefined;
optional: string | undefined;
hasDefault: boolean;
createdAt: Date | undefined;
updatedAt: Date | undefined;
uuid: string;
cuid: string;
}
// PersistedModel
interface Sample {
id: number;
required: number;
optional: string | undefined;
hasDefault: boolean;
createdAt: Date;
updatedAt: Date;
uuid: string;
cuid: string;
}

Jsonフィールドの型

通常PrismaスキーマでJson型を定義する場合、厳密な型を指定できません。

db/schema/main.prisma
model Sample {
id Int @id @default(autoincrement())
data Json // Jsonフィールドには厳密な型がありません
}

Accel RecordではBaseModelにおいてJson型のフィールドに対して型を指定することができます。
この場合は、Json型のフィールドも読み書きともに型安全に扱うことができます。

src/models/sample.ts
import { ApplicationRecord } from "./applicationRecord.js";
export class SampleModel extends ApplicationRecord {
// BaseModel上でJson型のフィールドに対して型を指定できる
data: { myKey1: string; myKey2: number } | undefined = undefined;
}
import { Sample } from "./models/index.js";
const sample = Sample.build({});
// OK
sample.data = { myKey1: "value1", myKey2: 123 };
// Type Error !
sample.data = { foo: "value1" };
// => Type '{ foo: string; }' is not assignable to type '{ myKey1: string; myKey2: number; } | undefined'.
// OK
console.log(sample.data?.myKey1);
// Type Error !
console.log(sample.data?.foo);
// => Property 'foo' does not exist on type '{ myKey1: string; myKey2: number; } | undefined'.