🍣
あれ?CUID作られないんだけど?
あれ?PostgresでCUID作られないんだけど?
Nuxt3のアプリケーションでPrismaを使っているときに、PostgresデータベースでCUIDが生成されない問題についてお話しします。
前提条件
- Nuxt3のアプリケーションでPrismaを使用しています。
- データベースにはPostgresを使用しています。
- ユーザーに自動インクリメントのIDを表示したくない場合があるので、UUIDを使用しています。
問題の背景
開発中にDBにSQLクライアントから手動でサンプルデータを追加したいシーンがあると思います。
ユーザーテーブルにUUIDカラムをdefault cuid
で設定しています。Prisma経由やPrisma Studioでユーザーを作成すると、CUIDが生成されてデータベースに保存されます。しかし、SQLクライアントを使用すると、Prismaスキーマでdefault cuid
になっていても、CUIDが生成されずnull
になってしまいます。
Prismaスキーマの設定
まず、PrismaスキーマでUUIDカラムを設定します。
model User {
id Int @id @default(autoincrement())
uuid String @unique @default(cuid())
name String
email String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
問題の原因
SQLクライアントで直接データを挿入する場合、Prismaが提供するCUID生成機能が働かないため、UUIDカラムがnull
になります。Prismaはクライアント側でCUIDを生成して、それをデータベースに保存する仕組みになっています。
解決策
Prisma経由でデータを操作するようにするか、SQLクライアントでデータを挿入する際には手動でCUIDを生成して設定する必要があります。手動でCUIDを生成する例を以下に示します。
import { cuid } from '@prisma/client';
const generateUser = async () => {
const newUser = await prisma.user.create({
data: {
uuid: cuid(),
name: 'John Doe',
email: 'john.doe@example.com',
},
});
console.log('User created:', newUser);
};
generateUser().catch(console.error);
まとめ
PrismaはNuxt3と連携して自動的にCUIDを生成し、Postgresデータベースに保存しますが、SQLクライアントを使用する場合はCUIDの生成を手動で行う必要があることを知りました。
Discussion