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 | ✅ | |
Enums | enum | ✅ |
Unsupported type | Unsupported | - |
フィールドタイプが必須の場合とオプションの場合で、NewModelとPersistedModelの型が異なります。
type | NewModel | PersistedModel |
---|---|---|
Required Field | Nullable | NonNullable |
Optional Field | Nullable | Nullable |
また、デフォルト値の指定方法によってもNewModelとPersistedModelの型が異なります。
arg | NewModel | PersistedModel |
---|---|---|
static value | NonNullable | NonNullable |
autoincrement() | Nullable | NonNullable |
now() | Nullable | NonNullable |
dbgenerated() | Nullable | NonNullable |
uuid() | NonNullable | NonNullable |
cuid() | NonNullable | NonNullable |
以下に、モデル定義とそれに対応するNewModelとPersistedModelの例を示します。
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())}
// NewModelinterface NewSample { id: number | undefined; required: number | undefined; optional: string | undefined; hasDefault: boolean; createdAt: Date | undefined; updatedAt: Date | undefined; uuid: string; cuid: string;}
// PersistedModelinterface Sample { id: number; required: number; optional: string | undefined; hasDefault: boolean; createdAt: Date; updatedAt: Date; uuid: string; cuid: string;}
Jsonフィールドの型
通常PrismaスキーマでJson型を定義する場合、厳密な型を指定できません。
model Sample { id Int @id @default(autoincrement()) data Json // Jsonフィールドには厳密な型がありません}
Accel RecordではBaseModelにおいてJson型のフィールドに対して型を指定することができます。
この場合は、Json型のフィールドも読み書きともに型安全に扱うことができます。
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({});
// OKsample.data = { myKey1: "value1", myKey2: 123 };
// Type Error !sample.data = { foo: "value1" };// => Type '{ foo: string; }' is not assignable to type '{ myKey1: string; myKey2: number; } | undefined'.
// OKconsole.log(sample.data?.myKey1);
// Type Error !console.log(sample.data?.foo);// => Property 'foo' does not exist on type '{ myKey1: string; myKey2: number; } | undefined'.