Prisma:(2)
2026年4月14日autoincrement():削除後
id Int @id @default(autoincrement())autoincrement()でIDが生成されるようにしている場合、そのデータを削除した後はそのデータに使われていたIDの数字は、以降のデータ挿入時には使われない。DBは「どの数字まで使ったか」を管理している為(Postgresの仕様)。
D1
*そこまで理解していない
Cloudflare D1 + Prisma + Tanstack-Start を使う場合:
pnpm add @prisma/client @prisma/adapter-d1// schema.prisma
generator client {
provider = "prisma-client"
output = "./generated/prisma"
runtime = "cloudflare"
}
datasource db {
provider = "sqlite"
}String[]やInt[]が使えないので、JSONにするか要素をRelationに分けることで解決する。
import { PrismaD1 } from "@prisma/adapter-d1";
export const getPrismaData = createServerFn().handler(async () => {
const prisma = new PrismaClient({ adapter: new PrismaD1(env.test_db) });
return await prisma.todo.findMany();
});Prismaのインスタンス化はserverActionの中で行わないとエラーになる。
開発時はローカルのD1データベースが使われる。
wrangler.jsoncのd1-databasesをremote:trueにすると開発時もローカルのD1は使われない。
// wrangler.jsonc
"d1_databases": [
{
...
"remote": true
}
],migrate 本番D1への適用
db push/migrateコマンドを本番のD1へ行えない。コマンドが機能しているように見えてもローカルのD1に適用されている。
本番のD1にモデルを適用する手順:
まず
migrate devをローカルで実行して、migrationフォルダにsqlファイルを生成以下のコマンドを実行し、sqlファイルの内容を本番のD1に反映させる
// パターンA
npx wrangler d1 execute --remote DB_NAME --file=./prisma/migrations/init/migration.sql
// パターンB
npx wrangler d1 migrations apply DB_NAME --remoteパターンBの場合は
wrangler.jsoncのmigrations_dirに最新のmigrationフォルダへのパスを書く。いずれもパターンもPrismaのモデルを変更するたびにmigrateを行ない、ファイル/フォルダへのパスを手動で指定するという手順は必要になる。
remote: trueにしていない場合はローカルD1への反映も必要になる。
エラー
PrismaConfigEnvError
TypeScript/JavaScript module. Error: PrismaConfigEnvError: Cannot resolve environment variable: DATABASE_URL.
スクラッチで始めたアプリで発生。URL文字列やPrisma関係の設定は間違っていない
対策:以下を prisma.config.tsの上部に追加
import dotenv from "dotenv";
import fs from "fs";
if (fs.existsSync(".env")) {
dotenv.config({ path: ".env" });
} else {
dotenv.config({ path: ".env.development" });
}serverAction
TypeError: The "payload" argument must be of type object. Received null
原因:
Schemaファイルのモデルで必須要素にしているのに何も値を渡していない場合
action関数内でcreateに渡したデータの型とモデルの型が違う場合