Prisma:(2)
2026年8月6日autoincrement():削除後
id Int @id @default(autoincrement())autoincrement()でIDが生成されるようにしている場合、そのデータを削除した後はそのデータに使われていたIDの数字が以降のデータ挿入時には使われない。-> DB側は「どの数字まで使ったか」を管理している為(Postgresの仕様)。
D1
pnpm add @prisma/client @prisma/adapter-d1// schema.prisma
generator client {
provider = "prisma-client"
output = "./generated/prisma"
runtime = "cloudflare"
}
datasource db {
provider = "sqlite"
}sqlite:
String[]やInt[]が使えないので、JSONにするか要素をRelationに分ける。*重要:
DATABASE_URL="file:./dev.db"やdev.db / db.sqliteはD1と直接的に関係がない。ローカルのD1は.wranglerフォルダ内にある為。しかし、最初のmigration.sqlやschema変更後のmigration.sql生成の為に必要なので残す。理由:Prisma CLIコマンドは直接D1に適用出来ない為。-> まずはローカルの
dev.dbなどにPrismaのmigrationコマンドを実行しsqlファイル(migration.sql)を生成。そしてそれをローカル/リモートD1に適用させるという流れになる。
// wrangler.jsonc
"d1_databases": [
{
...
// "remote": true,
"migrations_dir": "./prisma/migrations",
"migrations_pattern": "prisma/migrations/**/*.sql",
},
],Prisma studio:
db:studioはDATABASE_URL="file:./dev.db"を参照するのでCRUDをしてもデータが見れない。Workersにデプロイ予定であれば、ターミナルから space + eでローカルエクスプローラー(GUI)が起動できる。
migrate
// package.json
"db:generate": "dotenv -e .env.local -- prisma generate",
"db:push": "dotenv -e .env.local -- prisma db push",
"db:migrate": "dotenv -e .env.local -- prisma migrate dev",
"db:apply:local": "wrangler d1 migrations apply DB_NAME --local",
"db:apply:prod": "wrangler d1 migrations apply DB_NAME --remote"手順:
db:migrateでdev.db / db.sqliteを参照して./prisma/migrationsにsqlファイルを生成db:generateで型を生成npx wrangler d1 migrations apply DB_NAME --localでローカルのD1に反映npx wrangler d1 migrations apply DB_NAME --remoteでリモートのD1に反映
schemaを変更するたびに一連の流れが必要になる。remote: trueでリモートD1しか使わないなら「3」は不要
*prismaのインスタンス化
// db.ts
import { env } from "cloudflare:workers";
import { PrismaD1 } from "@prisma/adapter-d1";
import { PrismaClient } from "../../prisma/generated/prisma/client";
export const prisma = new PrismaClient({
adapter: new PrismaD1(env.test_db),
});上記のようにインスタンス化したprismaをexportすると
wrangler deploy時に本番環境でエラーが出る。トップレベルでインスタンス化をするとcloudflare:workersのenvにまだアクセスできない(undefined)のが原因と思われる。
// serverAction
export const getPrismaData = createServerFn().handler(async () => {
const prisma = new PrismaClient({ adapter: new PrismaD1(env.test_db) });
return await prisma.todo.findMany();
});
----
// db.ts
export const prisma = () => {
return new PrismaClient({
adapter: new PrismaD1(env.test_db),
});
};prismaのインスタンス化を毎回行うとエラーが消える。
-->
新たに Tanstack x D1のアプリを試してみると、トップレベル評価時点で cloudflare:workers の env が利用できなかったと思われる問題が消えている。今後はNode環境のNextjsと同じように一回のインスタンス化のパターンで良いかもしれない。
エラー
serverAction
TypeError: The "payload" argument must be of type object. Received null
原因:
Schemaファイルのモデルで必須要素にしているのに何も値を渡していない場合
action関数内でcreateに渡したデータの型とモデルの型が違う場合