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>
)
});