Open3
blitz generate を使わずに CRUD ページを作成するメモ
blitz generate
を使わずに実装することで、Blitz の仕組みを理解することを目的としたメモ。
はじめに、db/prisma.schema
ファイルにモデル定義を追加する。
model Project {
id String @id @default(uuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
code String
name String
}
モデル定義後、次のコマンドを実行しマイグレーションを実行する。
(マイグレーション実行)
$ blitz prisma migrate dev
(マイグレーション名を聞かれるので、今回は "add project" と入力する。)
√ Name of migration ... add project
マイグレーション後、次のコマンドを実行して Prisma Client を再生成する。
この手順は、モデル定義を変更した場合は常に必要。
(Prisma Client を再生成する)
$ blitz prisma generate
上記の手順で、blitz アプリケーションの db
から参照できるようになる。
blitz console
を利用し、動作確認する。
(blitz console 起動)
$ blitz console
(プロジェクト一覧を取得)
⚡️ > await db.project.findMany({})
prisma:query SELECT "public"."Project"."id", "public"."Project"."createdAt", "public"."Project"."updatedAt", "public"."Project"."code", "public"."Project"."name" FROM "public"."Project" WHERE 1=1 OFFSET $1
[]
取得データが 0 件のため、データベースへの接続等が問題ないことが確認できる。
つぎに、プロジェクト一覧ページを作成する。
app/pages/projects/index.tsx
ファイルを作成し、次のとおり実装する。
生成されるファイルとは若干違うが、どのページも基本的にはこの内容になるのでコピペして使っている。
import Layout from "app/core/layouts/Layout";
import { BlitzPage } from "blitz";
import { Suspense } from "react";
// コンテンツ用のコンポーネント
// React.VFC 型とする。
// <Suspense> 内で利用されることを想定している。
// useQuery, useMutation を利用する。
const ProjectListContent: React.VFC = () => {
return (
<ul>
<li>P001: プロジェクト-001</li>
<li>P002: プロジェクト-002</li>
<li>P003: プロジェクト-003</li>
</ul>
)
}
// ページを表すコンポーネント
// BlitzPage 型とする。
// useQuery, useMutation を利用しない部分を実装する。
const ProjectListPage: BlitzPage = () => {
return (
<div>
<h1>プロジェクト 一覧</h1>
<Suspense fallback={<div>Loading...</div>}>
<ProjectListContent />
</Suspense>
</div>
)
}
// 認証が必要なページの場合、true を指定する。
ProjectListPage.authenticate = true
// レイアウト
ProjectListPage.getLayout = (page) => <Layout title="プロジェクト 一覧">{page}</Layout>
// このページコンポーネントの名前で、ルーティングオブジェクト (Routes) が作られる。
export default ProjectListPage