拓冰建站拓冰建站
首页 / 资讯中心 / 正文

create-t3-app における Prisma 活用ガイド:型安全 ORM のセットアップ、スキーマ設計、データベース・シーディングまで

开发工具CLI代码生成【免费下载链接】create-t3-appThe best way to start a full-stack, typesafe Next.js app项目地址https://gitcode.com/gh_mirrors/cr/create-t3-app点击查看免费下载Prisma は TypeScript のための ORM であり、schema.prismaファイルでデータベーススキーマとモデルを定義し、バックエンドからデータベースとやり取りするための型安全なクライアントを生成できます。create-t3-app で Prisma を選択すると、CLI がクライアントの初期化からスキーマ生成、環境変数、npm スクリプトまでを一括でセットアップしてくれます。本記事では、生成されるsrc/server/db.tsの設計意図、スキーマファイルの構成、データベースプロバイダの切り替え方、そしてシーディングの実装手順までを、実際のリポジトリのソースコードと照らし合わせながら解説します。Prisma とはPrisma は TypeScript 向けのデータベースツールキットORMです。schema.prismaファイルでデータベーススキーマとモデルを宣言的に定義し、そのスキーマから型安全なクライアントを生成することで、SQL を直接書かずにデータベースへアクセスできます。モデル定義に対する型が自動生成されるため、コンパイル時にフィールド名や型の誤りを検出でき、リファクタリング時の安全性も高まります。create-t3-app では Prisma を選択すると、prismaInstaller が以下のパッケージを自動でインストールします。開発依存prismaCLIスキーマ管理本番依存prisma/client生成されるクライアント本体PlanetScale を選択した場合prisma/adapter-planetscaleとplanetscale/databaseバージョンは dependencyVersionMap.ts に固定マッピングされており、現時点ではprisma・prisma/clientともに^6.6.0、アダプタはprisma/adapter-planetscale: ^6.6.0が使用されます。npm レジストリへの問い合わせを省くことで、インストールのパフォーマンスも最適化されています。Prisma Clientsrc/server/db.tsの設計Prisma クライアントはsrc/server/db.tsに置かれ、グローバル変数としてインスタンス化されたうえでエクスポートされ、API ルートで使用されます。これは Prisma チームが Next.js 開発時のベストプラクティスとして推奨しているパターンです。実際の生成テンプレートdb-prisma.tsを見ると、その設計が明確にわかります。import { env } from ~/env; import { PrismaClient } from ../../generated/prisma; const createPrismaClient () new PrismaClient({ log: env.NODE_ENV development ? [query, error, warn] : [error], }); const globalForPrisma globalThis as unknown as { prisma: ReturnTypetypeof createPrismaClient | undefined; }; export const db globalForPrisma.prisma ?? createPrismaClient(); if (env.NODE_ENV ! production) globalForPrisma.prisma db;この実装が解決しているのは、Next.js のホットリロードFast Refresh時に開発サーバが再起動されるたびに Prisma クライアントが多重生成され、データベース接続がリークするという問題です。globalThisにクライアントを保持し、NODE_ENVがproduction以外の場合だけグローバルに再利用する、という 2 段構えのパターンによって、開発時の再生成を防いでいます。また、PrismaClientのlogオプションは環境によって切り替わります。開発環境developmentquery実行 SQL、error、warnを出力それ以外テスト・本番errorのみこれにより、開発中はクエリログを確認しながらデバッグでき、本番ではログノイズを抑えられます。なお、生成されるクライアントの出力先はスキーマのgenerator clientブロックでoutput ../generated/prismaと指定され、プロジェクト直下のgenerated/prismaに置かれる点にも注目してくださいbase.prisma。PlanetScale を選んだ場合のクライアントデータベースプロバイダとして PlanetScale を選択した場合は、db-prisma-planetscale.ts がコピーされます。こちらは Prisma のドライバアダプタ機能を使って、PlanetScale 用アダプタを直接クライアントに渡します。import { PrismaPlanetScale } from prisma/adapter-planetscale; import { env } from ~/env; import { PrismaClient } from ../../generated/prisma; const createPrismaClient () new PrismaClient({ log: env.NODE_ENV development ? [query, error, warn] : [error], adapter: new PrismaPlanetScale({ url: env.DATABASE_URL }), });このアダプタを使うため、スキーマ側ではpreviewFeatures [driverAdapters]を有効にしたうえで、relationMode prisma外部キー制約をデータベース側で強制しない設定がコメント付きで追加されますbase-planetscale.prisma。tRPC コンテキストへの組み込みcreate-t3-app では Prisma クライアントがデフォルトで tRPC のコンテキスト に含まれており、各ファイルで個別にインポートするのではなく、コンテキスト経由で利用することを推奨しています。tRPC を使う場合、createTRPCContextは次のようにdbを返しますwith-auth-db.ts。import { db } from ~/server/db; export const createTRPCContext async (opts: { headers: Headers }) { const session await auth(); return { db, session, ...opts, }; };これにより、ルーター内ではctx.dbとして型安全にアクセスできます。実際のルーター実装with-prisma.tsでは、次のように利用されています。create: publicProcedure .input(z.object({ name: z.string().min(1) })) .mutation(async ({ ctx, input }) { return ctx.db.post.create({ data: { name: input.name, }, }); }), getLatest: publicProcedure.query(async ({ ctx }) { const post await ctx.db.post.findFirst({ orderBy: { createdAt: desc }, }); return post ?? null; }),ctx.db.post.createやctx.db.post.findFirstがコンパイル時に型チェックされるため、フィールド名のタイポや存在しないフィールドへのアクセスを即座に検出できます。スキーマファイルの構成Prisma のスキーマファイルはプロジェクトの/prisma/schema.prismaに置かれます。ここでデータベーススキーマとモデルを定義し、Prisma クライアント生成時の元ネタになります。Prisma を選択した場合、create-t3-app は認証ライブラリの選択NextAuth.jsBetter Authなしとデータベースプロバイダに応じて、適切なスキーマテンプレートをコピーします。インストーラprisma.tsのロジックは以下のとおりです。const schemaBaseName packages?.betterAuth.inUse ? with-better-auth : packages?.nextAuth.inUse ? with-auth : base; const schemaSrc path.join( extrasDir, prisma/schema, ${schemaBaseName}${ databaseProvider planetscale ? -planetscale : }.prisma );つまり、テンプレートディレクトリ cli/template/extras/prisma/schema 内のbase.prisma、with-auth.prisma、with-better-auth.prismaと、それぞれの-planetscale版から 1 つが選ばれ、プロジェクトのprisma/schema.prismaに書き出されます。基本スキーマ認証なし認証を使わない場合のスキーマbase.prismaは次のようになります。generator client { provider prisma-client-js output ../generated/prisma } datasource db { provider sqlite url env(DATABASE_URL) } model Post { id Int id default(autoincrement()) name String createdAt DateTime default(now()) updatedAt DateTime updatedAt index([name]) }Postモデルは idname作成日時更新日時の最小構成で、index([name])によるインデックスも定義済みです。datasourceブロックのurlはenv(DATABASE_URL)で環境変数から読み込むため、接続先をコードにハードコードしません。NextAuth.js と組み合わせた場合NextAuth.js と Prisma を同時に選択すると、NextAuth.js の Prisma アダプタが要求するUser・Session・Account・VerificationTokenの 4 モデルが、公式ドキュメント推奨の値でスキーマファイルに自動生成されますwith-auth.prisma。ポイントを整理すると、以下のとおりです。Useridはcuid()で自動生成、emailはuniqueAccountproviderとproviderAccountIdの複合ユニークunique([provider, providerAccountId])、userへのリレーションはonDelete: CascadeSessionsessionTokenはunique、userへのリレーションはonDelete: CascadeVerificationTokenidentifierとtokenの複合ユニークPostモデルにもcreatedBycreatedByIdが追加され、Userとのリレーションを持ちますまた、Accountモデルのrefresh_token・access_token・id_tokenには// db.Textというコメント付きの注釈があります。これは MySQLSQL Server でString型VARCHARのままではトークンが長すぎて保存できない問題への対策です。create-t3-app のインストーラは、データベースプロバイダがmysqlまたはplanetscaleの場合にこのコメントを自動的に有効化しますschemaText.replace(// db.Text, db.Text)。SQLitePostgreSQL を使う場合はコメントのままで問題ありません。デフォルトのデータベースとプロバイダの切り替えcreate-t3-app のデフォルトデータベースはSQLiteです。セットアップ直後からファイルベースで動作するため、開発や PoC概念実証を素早く立ち上げるのには最適ですが、同時実行やスケーラビリティの面から本番環境での使用は推奨されません。使用するデータベースを変更するには、次の 2 点を変更します。schema.prismaのdatasourceブロックにあるproviderをpostgresqlまたはmysqlに変更環境変数DATABASE_URLの接続文字列を対象データベースのものに更新プロバイダごとの DATABASE_URLCLI は選択したプロバイダに応じて.env.env.exampleに接続文字列の雛形を書き込みますenvVars.ts。プロバイダproviderの値生成されるDATABASE_URLの雛形SQLiteデフォルトsqliteDATABASE_URLfile:./db.sqlitePostgreSQLpostgresqlDATABASE_URLpostgresql://postgres:passwordlocalhost:5432/appNameMySQLmysqlDATABASE_URLmysql://root:passwordlocalhost:3306/appNamePlanetScalemysqlDATABASE_URLmysql://YOUR_MYSQL_URL_HERE?sslacceptstrictプロジェクト名appNameは CLI 実行時に入力した名前がそのままデータベース名に使われます。PlanetScale の場合は、PlanetScale のコンソールで「prisma」ドロップダウンから発行された接続 URL を使い、末尾に?sslacceptstrictを付けるというガイドがコメントとして書き込まれます。インストーラによるスキーマ変換プロバイダを SQLite 以外にした場合、インストーラはスキーマファイルのprovider sqliteを選択されたプロバイダに置換します。mysqlpostgresqlplanetscaleのマッピングはインストーラ内に定義されており、PlanetScale は内部的にはmysqlとして扱われます。さらに、前述のとおりmysqlplanetscaleではdb.Text注釈も同時に有効化されます。ただし、すでにプロジェクトを作成済みの場合は、この変換は自動では行われません。providerを手で書き換えた後、pnpm db:pushなどでスキーマをデータベースに反映し、.envのDATABASE_URLを更新する必要があります。環境変数のバリデーションPrisma を使うプロジェクトでは、src/env.jsにDATABASE_URLのバリデーションが追加されますwith-db.js。DATABASE_URL: z.string().url(),t3-oss/env-nextjsとzodによるこのバリデーションにより、DATABASE_URLが未設定・不正な形式のままnext buildやnext devを実行すると、起動時にエラーで検出されます。空文字を未定義として扱うemptyStringAsUndefined: trueの設定と合わせて、環境変数ミスによる実行時トラブルを未然に防ぎます。スキップしたい場合はSKIP_ENV_VALIDATION環境変数を指定しますDocker ビルドなどで有用です。package.json に追加される npm スクリプトPrisma インストーラは、次の 5 つのスクリプトをpackage.jsonに追加しますprisma.ts。スクリプト実行されるコマンド用途postinstallprisma generate依存関係インストール後に自動でクライアント生成db:pushprisma db pushスキーマをデータベースに直接反映マイグレーション履歴を作らないdb:studioprisma studioブラウザベースのデータ閲覧・編集 UI を起動db:generateprisma migrate dev開発用マイグレーション作成適用クライアント再生成db:migrateprisma migrate deploy本番環境向けに既存マイグレーションを適用postinstallが設定されているため、pnpm installまたはnpm installyarnを実行するだけで Prisma クライアントが自動生成され、src/server/db.tsの import が解決されます。データベースのシーディングデータベースのシーディング訳註データベース構築時にダミーデータや初期データを投入することは、開発を始める際にテストデータを素早く投入できる非常に便利な機能です。create-t3-app の公式ドキュメントに沿ったセットアップ手順は次のとおりです。1.seed.tsを作成する/prismaディレクトリにseed.tsファイルを作成します。import { db } from ../src/server/db; async function main() { const id cl9ebqhxk00003b600tymydho; await db.example.upsert({ where: { id, }, create: { id, }, update: {}, }); } main() .then(async () { await db.$disconnect(); }) .catch(async (e) { console.error(e); await db.$disconnect(); process.exit(1); });このサンプルはupsertを使って指定 ID のレコードが存在すれば更新、なければ作成するという冪等何度実行しても同じ結果なシーディングです。最後にdb.$disconnect()を呼んで接続を閉じ、エラー時はprocess.exit(1)で異常終了させる、という定番の流れになっています。なお、上の例のdb.exampleはあくまで雛形です。実際のプロジェクトでは、スキーマで定義したモデル名に合わせてください。現在のリポジトリの基本スキーマbase.prismaではモデルはPostなので、db.post.upsert(...)のようになります。2.package.jsonにシード設定を追加するpackage.jsonのscriptsにdb-seedを追加し、prismaキーにシード実行コマンドを定義します。{ scripts: { db-seed: NODE_ENVdevelopment prisma db seed }, prisma: { seed: tsx prisma/seed.ts } }NODE_ENVdevelopmentを明示しているのは、src/server/db.tsのログ設定がNODE_ENVで切り替わるためです。prisma db seedコマンドがprisma.seedで指定されたコマンドを実行します。3. TypeScript ランナーを導入するシードスクリプトは TypeScript で書かれているため、実行できるランナーが必要です。create-t3-app が推奨するのはtsxです。esbuild ベースで非常に高速に動作し、ESM 設定ts-nodeで必要になるようなが不要という利点があります。ts-nodeや他のランナーでも動作します。pnpm add -D tsx4. 実行するあとは次のコマンドを実行するだけです。pnpm db-seednpmやyarnを使っている場合は、それぞれnpm run db-seed、yarn db-seedと読み替えてください。まとめcreate-t3-app が生成する Prisma 構成は、単なる ORM の雛形ではなく、「Next.js 開発における実践的な設計」が織り込まれています。グローバルクライアントパターンsrc/server/db.tsによる開発時の接続リーク防止環境別のログレベル開発時はqueryerrorwarn、本番はerrorのみtRPC コンテキスト経由のdb公開による各ファイルでの個別 import 回避NextAuth.js 連携モデルの自動生成と MySQL 向けdb.Textの自動有効化PlanetScale ドライバアダプタへの透過的な切り替えpostinstall・db:push・db:studio・db:generate・db:migrateという整備済み npm スクリプトスキーマファイルは cli/template/extras/prisma/schema に、クライアント実装は cli/template/extras/src/server/db に、インストール処理は cli/src/installers/prisma.ts にそれぞれ置かれているため、興味があればぜひ読み進めてみてください。また、環境変数まわりは envVars.ts と src/env.js を、tRPC との連携は tRPC のドキュメント を参照すると、より全体像を把握できます。関連する公式リソースとしては、Prisma 公式ドキュメント、Prisma GitHub リポジトリ、Prisma Migrate プレイグラウンド、NextAuth.js の Prisma アダプタ解説、PlanetScale 接続ガイドなどが役立ちます。いずれも Prisma のスキーマ記法の詳細やマイグレーションの応用手法を学ぶ際に参照してください。赞分享开发工具CLI代码生成【免费下载链接】create-t3-appThe best way to start a full-stack, typesafe Next.js app项目地址https://gitcode.com/gh_mirrors/cr/create-t3-app点击查看免费下载相关推荐モデルのパラメータ解説voice-changerにおける各設定の意味と影響モデルのパラメータ解説voice changerにおける各設定の意味と影響 1. はじめに voice changerはリアルタイムで音声を変換するツールであ人工智能语音模型推理服务深度学习蓝鲸PaaS前端webfe开发指南Vue.js单页应用快速本地启动与调试完整教程蓝鲸PaaS前端webfe开发指南Vue.js单页应用快速本地启动与调试完整教程 文章概要 蓝鲸智云 PaaS 平台BlueKing PaaS是一后端云原生微服务前端企业应用开发者门户プロジェクトレベル CLAUDE.md 実践ガイドECC リポジトリに学ぶエージェント向け開発規約の設計とプロンプト防御プロジェクトレベル CLAUDE.md 実践ガイドECC リポジトリに学ぶエージェント向け開発規約の設計とプロンプト防御 プロジェクトレベル CLAUDE.m人工智能AI 技能AI 插件AI 评测Agent 评测MCP Clients开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门