本文へスキップ
Typle
ログイン状態を確認中

プログラミング · Prisma · TypeScript

Prisma構文のタイピング練習

Prisma ORM 7 と TypeScript の書き方64個を、初級・上級の2つのリストで打って覚えます。schema.prisma の generator・datasource・model から、prisma.$disconnect などのクライアントの操作まで練習できます。

2リスト・64語

無料・ログインなしで練習できます。押すとこのパックをフォローし、すぐに練習が始まります。

収録している言葉

Prisma構文(初級)

打つ言葉意味・補足
// Prisma ORM 7 / TypeScript / PostgreSQL対象環境:例の前提(コードは断片。生成済みClient・DB接続・モデル等が必要。v6以前と設定が異なる)
await prisma.$disconnect();$disconnect:接続リソースを終了(短命スクリプトの終了時等。サーバーで毎リクエスト切断しない)
datasource db { provider = "postgresql" }datasource:DBプロバイダー指定(Prisma 7の接続URLはprisma.config.ts側)
model Note { id Int @id @default(autoincrement()) body String }model:モデル定義(Prisma Schema Language)
name String ?String?:任意フィールド(DBでは通常NULL許容)
tags String[]String[]:配列フィールド(対応DBに依存。このCSVはPostgreSQL)
id Int @id @default(autoincrement())@id:主キー
email String @unique@unique:一意制約
active Boolean @default(true)@default:既定値
createdAt DateTime @default(now())@default(now()):作成時日時
updatedAt DateTime @updatedAt@updatedAt:Prisma更新時の日時(Prisma ORMレベルで管理。外部SQL更新では自動反映されない)
author User @relation(fields: [authorId], references: [id])@relation:リレーション(対応するauthorId・反対側フィールド等が必要)
@@unique([authorId, title])@@unique:複合一意制約(モデルブロック内。既存データと制約を確認)
@@index([authorId, published])@@index:インデックス(モデルブロック内。変更はDBへ適用が必要)
displayName String @map("display_name") @@map("users")@map / @@map:DB上の名前と対応付け(モデル内の別々の宣言例)
enum Role { ADMIN MEMBER }enum:列挙型(モデル側で型として参照。DB対応を確認)
const users = await prisma.user.findMany();findMany:複数件取得(全件取得はデータ量に注意)
const user = await prisma.user.findUnique({ where: { id: 1 } });findUnique:一意条件で1件(なければnull)
await prisma.user.findMany({ where: { age: { gte: 20 } } });where:絞り込み
await prisma.user.findMany({ where: { name: null } });null:NULL条件(undefinedと同じ意味ではない。未定義値の扱いは設定も確認)
await prisma.user.findMany({ select: { id: true, email: true } });select:取得するフィールドを限定(同じ階層でincludeと併用不可)
const count = await prisma.user.count({ where: { active: true } });count:件数
await prisma.post.delete({ where: { id: 1 } });delete:1件削除(対象なしは例外。実データが削除される)
await prisma.post.deleteMany({ where: { published: false } });deleteMany:複数件削除(where省略は全件削除)
npx prisma generateprisma generate:Clientを生成(ターミナルで実行。DBスキーマ変更は適用しない)
npx prisma formatprisma format / validate:スキーマ整形・検証(ターミナルで実行)
npx prisma validateprisma format / validate:スキーマ整形・検証(ターミナルで実行)
npx prisma migrate dev --name initprisma migrate dev:開発用マイグレーション(開発用。リセット要求が出る場合がある。本番向けではない)
npx prisma migrate deployprisma migrate deploy:既存のマイグレーションを適用(通常CI・デプロイ時。新規マイグレーションやClientを生成しない)
npx prisma db pullprisma db pull:既存DBからスキーマへ反映(schema.prismaが変更されるため差分を確認)
npx prisma db pushprisma db push:履歴を作らずDBへ同期(試作等向け。データ損失を伴う変更に注意)
npx prisma studioprisma studio:データ閲覧・編集UI(実データを書き換えられる。Prisma 7の対応DB等を確認)

Prisma構文(上級)

打つ言葉意味・補足
generator client { provider = "prisma-client" output = "../src/generated/prisma" } datasource db { provider = "postgresql" } model User { id Int @id @default(autoincrement()) email String @unique name String? age Int? active Boolean @default(true) createdAt DateTime @default(now()) tags String[] profile Json? posts Post[] } model Post { id Int @id @default(autoincrement()) title String published Boolean @default(false) authorId Int author User @relation(fields: [authorId], references: [id]) }サンプルschema.prisma:クエリ例に使うモデル(PostgreSQL向け。Client生成・マイグレーションが必要。コード例は独立した断片)
import "dotenv/config"; import { defineConfig, env } from "prisma/config"; export default defineConfig({ schema: "prisma/schema.prisma", migrations: { path: "prisma/migrations" }, datasource: { url: env("DATABASE_URL") } });prisma.config.ts:CLIの接続設定(Prisma 7の例。dotenv等の依存とDATABASE_URLが必要)
import "dotenv/config"; import { PrismaClient } from "./generated/prisma/client"; import { PrismaPg } from "@prisma/adapter-pg"; const connectionString = process.env.DATABASE_URL; if (!connectionString) throw new Error("DATABASE_URL is required"); const adapter = new PrismaPg({ connectionString }); const prisma = new PrismaClient({ adapter });PrismaClient / adapter:PostgreSQLに接続するClient(src/db.tsを想定。生成先・拡張子等は環境に合わせる。Prisma 7の通常の直接接続向け)
generator client { provider = "prisma-client" output = "../src/generated/prisma" }generator:Client生成方法を指定(Prisma 7ではoutput指定が必要。schema.prismaに記述)
const user = await prisma.user.findUniqueOrThrow({ where: { id: 1 } });findUniqueOrThrow:なければ例外
const user = await prisma.user.findFirst({ where: { active: true }, orderBy: { id: 'asc' } });findFirst:条件に合う先頭の1件(なければnull。順序が必要ならorderBy)
await prisma.user.findMany({ where: { active: true, OR: [{ age: { gte: 20 } }, { age: null }] } });AND / OR / NOT:条件の組合せ
await prisma.user.findMany({ where: { id: { in: [1, 2, 3] } } });in / notIn:候補で絞る(NULLの扱いに注意)
await prisma.user.findMany({ where: { email: { contains: 'example.com', mode: 'insensitive' } } });contains / mode:文字列部分一致(modeはPostgreSQL向け。DBによって対応が異なる)
await prisma.user.findUnique({ where: { id: 1 }, include: { posts: true } });include:関連データを取得(関連件数・クエリ負荷に注意)
await prisma.user.findMany({ where: { posts: { some: { published: true } } } });relation some:関連行の存在条件(none・every等もある。everyは関連0件でも真)
await prisma.user.findMany({ orderBy: [{ createdAt: 'desc' }, { id: 'desc' }] });orderBy:並べ替え
await prisma.user.findMany({ orderBy: { id: 'asc' }, skip: 20, take: 10 });skip / take:件数とオフセット(大きいskipの負荷に注意)
await prisma.user.findMany({ cursor: { id: 100 }, skip: 1, take: 10, orderBy: { id: 'asc' } });cursor:カーソルページング(一意なカーソル等と順序を整合させる)
await prisma.user.findMany({ distinct: ['name'], select: { name: true } });distinct:重複を除いた結果(DB側のSELECT DISTINCTと同じ実装とは限らない)
await prisma.user.aggregate({ _avg: { age: true }, _max: { age: true } });aggregate:集計(対象なし・NULLでは集計値がnullの場合)
await prisma.post.groupBy({ by: ['authorId'], _count: { _all: true } });groupBy:グループ集計
await prisma.user.create({ data: { email: 'pomo@example.com', name: 'Pomo', tags: [] } });create:1件追加(一意制約競合で失敗し得る)
await prisma.user.createMany({ data: [{ email: 'a@example.com', tags: [] }, { email: 'b@example.com', tags: [] }], skipDuplicates: true });createMany:複数件追加(skipDuplicatesは対応DBに依存。例はPostgreSQL)
await prisma.user.createManyAndReturn({ data: [{ email: 'c@example.com', tags: [] }] });createManyAndReturn:複数追加して行を返す(対応DB・バージョンに依存。このCSVはPrisma 7/PostgreSQL)
await prisma.user.update({ where: { id: 1 }, data: { name: 'New' } });update:一意条件で更新(対象なしは例外)
await prisma.user.updateMany({ where: { active: false }, data: { name: null } });updateMany:一致する複数行を更新(whereを省略すると全件)
await prisma.user.update({ where: { id: 1 }, data: { age: { increment: 1 } } });increment:数値を原子的に加算(NULLのageは加算されない)
await prisma.user.upsert({ where: { email: 'pomo@example.com' }, update: { name: 'New' }, create: { email: 'pomo@example.com', tags: [] } });upsert:存在すれば更新・なければ追加(DBネイティブupsertになる条件等を確認)
await prisma.user.create({ data: { email: 'nested@example.com', tags: [], posts: { create: { title: 'Hello' } } } });nested create:関連もまとめて作成(一連のネスト書き込みは原子的)
await prisma.post.create({ data: { title: 'Hello', author: { connect: { id: 1 } } } });connect:既存行と関連付け(関連先が必要)
await prisma.user.findMany({ where: { tags: { has: 'sql' } } }); await prisma.user.update({ where: { id: 1 }, data: { tags: { push: 'go' } } });has / push:配列の検索・追記(スカラーリスト対応DB向け)
await prisma.$transaction([prisma.user.update({ where: { id: 1 }, data: { active: true } }), prisma.post.updateMany({ where: { authorId: 1 }, data: { published: true } })]);$transaction([]):クエリをまとめて確定(失敗時はDB書き込みをロールバック。既にawaitした結果は渡さない)
await prisma.$transaction(async (tx) => { const user = await tx.user.create({ data: { email: 'tx@example.com', tags: [] } }); await tx.post.create({ data: { title: 'Hello', authorId: user.id } }); });$transaction(callback):処理を含むトランザクション(内部はtxを使う。外部通信等で長時間保持しない)
const id = 1; const rows = await prisma.$queryRaw `SELECT id, email FROM "User" WHERE id = ${id}`;$queryRaw:パラメーター付きSQL取得(タグ付きテンプレートを使用。識別子の動的置換には使えない)
const id = 1; await prisma.$executeRaw `UPDATE "User" SET active = false WHERE id = ${id}`;$executeRaw:パラメーター付きSQL更新(実データを変更。文字列連結やUnsafe APIへ未検証入力を渡さない)
import { Prisma } from './generated/prisma/client'; try { await prisma.user.create({ data: { email: 'pomo@example.com', tags: [] } }); } catch (e) { if (e instanceof Prisma.PrismaClientKnownRequestError && e.code === 'P2002') { console.log('一意制約違反'); } else { throw e; } }PrismaClientKnownRequestError:既知のDB操作エラーを判定(importパスはsrc内の例。再試行・ユーザー表示は用途に合わせる)

ほかの公式パックを見る