はじめに
SvelteKitは昨年12月にバージョン1.0に到達しました!
今後、Webアプリケーションを作っていく選択肢の1つとしてとSvelteKit
を使って開発していくというのはありだと思っています。
SvelteKit
にPrisma
とSupabase
を組み合わせた開発というのは鉄板の構成の1つになりそうなのでセットアップ方法を紹介します!
SvelteKitの初期設定
SvelteKitの新規プロジェクトをCLIを使って作成します。
$ npm create svelte@latest sveltekit-prisma-supabase
今回はTypeScriptを使用する前提で記事を書いていきますのでTypeScript
のみ選択しました。
他に、ESLint
,Prettier
,Playwright
,Vitest
を使用するか選択することができます!
今回の記事では言及しませんが、使用したい場合は選択しましょう。
create-svelte version 2.3.1
Welcome to SvelteKit!
✔ Which Svelte app template? › Skeleton project
✔ Add type checking with TypeScript? › Yes, using TypeScript syntax
✔ Add ESLint for code linting? … No
✔ Add Prettier for code formatting? … No
✔ Add Playwright for browser testing? … No
✔ Add Vitest for unit testing? … No
$ cd sveltekit-prisma-supabase
$ npm install
$ npm run dev
http://localhost:5173/
にアクセスし、Welcome to SvelteKit
の画面が表示されたらSvelteKitのセットアップは完了です。
Supabaseの初期設定
Supabaseを利用するにはGitHubアカウントでログインするか、アカウント登録が必要なのでどちらかを選んでログインしましょう。
new project
でプロジェクトを作成します。
プロジェクトの名前とデータベースのパスワードを設定して、リージョンは特別理由がない限りは、Northeast Asia(Tokyo)
を選択するといいと思います。 料金プランはFree
を選択します。
シャドウデータベースを作成する
この問題はissueが立っているので今後解消されて、シャドウデータベースを作成する必要がなくなる可能性があります。
Prismaのマイグレーションはpostgresデータベースを削除しようする影響で、Supabaseデータベースとの競合を引き起こす可能性があります。その回避策として今回は、Prisma Shadow Databasesを使用する為、シャドウデータベースを作成します。
Settings
-> Database
-> Connection String
-> PSQL
の文字列をコピーして、psql CLI
を使って接続します。
$ psql -h db.[YOUR-PROJECT-REF].supabase.co -p 5432 -d postgres -U postgres
接続できたら、データベースを作成します。
postgres=> CREATE DATABASE postgres_shadow;
postgres=> exit;
これでシャドウデータベースの作成は完了です。
Prismaの初期設定
まずは必要なパッケージをインストールします。
$ npm install prisma --save-dev
$ npm install @prisma/client
次に、prismaのセットアップをします。
$ npx prisma init
実行するとprisma/schema.prisma
と.env
が自動的に作成されると思いますので、次はこれらのファイルを編集していきます。
DBのマイグレーション
prisma/schema.prisma
に以下のようなスキーマを定義します。
モデルは今回適当に用意したものを使います。
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
.env
は以下のように定義します。
[YOUR-PASSWORD]
と[YOUR-PROJECT-REF]
は適宜書き換えてください。
DATABASE_URL="postgres://postgres:[YOUR-PASSWORD]@db.[YOUR-PROJECT-REF].supabase.co:5432/postgres"
SHADOW_DATABASE_URL="postgres://postgres:[YOUR-PASSWORD]@db.[YOUR-PROJECT-REF].supabase.co:5432/postgres_shadow"
最後にPrismaのマイグレーションコマンドを実行します。
$ npx prisma migrate dev --name init
Supabaseのダッシュボードの Database
-> Tables
を確認するとスキーマ定義どおりにテーブルが作成されているのがわかります。
SvelteKit + Prismaを使ってデータ取得、表示
src/lib/server/prisma.ts
を作成します。
SvelteKitではファイル名に.server
をつけるかsrc/lib/server
内にファイルを置くことでサーバーでのみ実行できるように制限することができます。
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export default prisma;
まずはデータを取得します。src/routes/+page.server.ts
を作成します。
PrismaのfindMany()
を使ってuser
テーブルから複数のレコードを取得して返します。
import prisma from '$lib/server/prisma';
import type { PageServerLoad } from './$types';
export const load = (async () => {
return {
users: await prisma.user.findMany()
};
}) satisfies PageServerLoad;
次に、このままだとDBのuserテーブルが空で何も表示できないのでSupabaseのTable Editor
-> Insert row
からいくつかデータを追加しておきましょう。
最後に出力側です。src/routes/+page.svelte
を編集します。
+page.server.ts
で取得して返したデータがdata
に格納されているのでdata
からusers
を取り出して表示させてみます。
<script lang="ts">
import type { PageData } from './$types';
export let data: PageData;
const { users } = data;
</script>
<ul>
{#each users as user}
<li>id: {user.id}</li>
<li>email: {user.email}</li>
<li>name: {user.name}</li>
{/each}
</ul>
Supabase
のDBに接続し、SvelteKit
+ Prisma
を使ってデータを取得、表示することができました!
おわりに
すごく簡単にSvelteKit
+ Prisma
+ Supabase
で開発できる環境をセットアップすることができました!
これからSvelteKitで開発してみたいよという方は是非参考にしてみてください!