🍣

あれ?CUID作られないんだけど?

2024/06/16に公開

あれ?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