Prisma

Prismaを使用すると、MongoDBまたはSQLデータベースとのインタラクションを完全にタイプセーフな方法で行うことができます。

Prismaでは、.prismaファイルでDBスキーマを定義し、そのCLIはDBマイグレーションとTypeScript型を自動的に生成します。

Prismaは、QwikでrouteLoader$routeAction$、およびserver$関数で使用できます。これらは、サーバー側でのみコードを実行できるようにするQwik APIです。

QwikにPrismaを追加する最も簡単な方法は、pnpm qwik add prismaコマンドを使用することです。これにより、必要な依存関係がインストールされ、Prismaスキーマとマイグレーションを含むprismaフォルダーが作成されます。

npm run qwik add prisma

Prismaを使用すると、Postgres、MySQL、SQLite、MongoDBなど、さまざまなデータベースを簡単に使用できます。

すべてのユーザーのリスト

routeLoader$を使用して、prisma.user.findMany()を使用してDB内のすべてのユーザーをクエリし、結果を返します。

src/routes/users/index.tsx
import { component$ } from '@builder.io/qwik';
import { routeLoader$ } from '@builder.io/qwik-city';
import { PrismaClient } from '@prisma/client'
 
export const useGetUsers = routeLoader$(async () => {
  const prisma = new PrismaClient();
  // example read from SQLite
  const users = await prisma.user.findMany()
  return users;
});
 
export default component$(() => {
  const users = useGetUsers();
  return (
    <section>
      <h1>User's directory</h1>
      <ul>
        {users.value.map(user => (
          <li key={user.id}>
            <a href={`/users/${user.id}`}>{user.name} ({user.email})</a>
          </li>
        ))}
      </ul>
    </section>
  )
});

ユーザー詳細の表示

routeLoader$を使用して、prisma.user.findUnique()を使用して、userId URLパラメーターに基づいて特定のユーザーをクエリし、結果を返します。

src/routes/users/[userId]/index.tsx
import { component$ } from '@builder.io/qwik';
import { routeLoader$ } from '@builder.io/qwik-city';
import { PrismaClient } from '@prisma/client'
 
export const useGetUser = routeLoader$(async ({params, status}) => {
  const userId = parseInt(params['userId'], 10);
  const prisma = new PrismaClient();
  const user = await prisma.user.findUnique({where: {id: userId}});
  if (!user) {
    // Set the status to 404 if the user is not found
    status(404);
  }
  return user;
});
 
export default component$(() => {
  const user = useGetUser();
  return (
    <section>
      <h1>User detail</h1>
      {user.value ? (
        <>
          <p>Name: {user.value.name}</p>
          <p>Email: {user.value.email}</p>
        </>
      ) : (
        <p>User not found</p>
      )}
    </section>
  )
});

ユーザーの追加

routeAction$Formを使用して、新しいユーザーをDBに追加するためのプログレッシブフォームを作成します。prisma.user.create()を使用してユーザーを作成します。

src/routes/create/index.tsx
import { component$ } from '@builder.io/qwik';
import { routeAction$, zod$, z, Form } from '@builder.io/qwik-city';
import { PrismaClient } from '@prisma/client'
 
export const useCreateUser = routeAction$(async (data) => {
  const prisma = new PrismaClient();
  const user = await prisma.user.create({
    data,
  });
  return user;
}, zod$({
  name: z.string(),
  email: z.string().email(),
}));
 
export default component$(() => {
  const createUserAction = useCreateUser();
  return (
    <section>
      <h1>Create User</h1>
      <Form action={createUserAction}>
        <label>Name
          <input name="name" value={createUserAction.formData?.get('name')} />
        </label>
        <label>Email
          <input name="email" value={createUserAction.formData?.get('email')} />
        </label>
        <button type="submit">Create</button>
      </Form>
      {createUserAction.value && (
        <div>
          <h2>User created successfully!</h2>
        </div>
      )}
    </section>
  )
});

貢献者

このドキュメントの改善にご協力いただいたすべての貢献者に感謝します!

  • manucorporat
  • ulic75
  • igorbabko
  • adcar
  • ruheni
  • Benny-Nottonson
  • mrhoodz
  • enesflow
  • fabian-hiller
  • aendel