25
19

More than 1 year has passed since last update.

SvelteKit + Prisma + Supabaseで開発できる環境をセットアップする

Last updated at Posted at 2023-01-24

はじめに

SvelteKitは昨年12月にバージョン1.0に到達しました!

今後、Webアプリケーションを作っていく選択肢の1つとしてとSvelteKitを使って開発していくというのはありだと思っています。
SvelteKitPrismaSupabaseを組み合わせた開発というのは鉄板の構成の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のセットアップは完了です。
スクリーンショット 2023-01-24 16.21.01.png

Supabaseの初期設定

Supabaseを利用するにはGitHubアカウントでログインするか、アカウント登録が必要なのでどちらかを選んでログインしましょう。

new projectでプロジェクトを作成します。
プロジェクトの名前とデータベースのパスワードを設定して、リージョンは特別理由がない限りは、Northeast Asia(Tokyo)を選択するといいと思います。 料金プランはFreeを選択します。

スクリーンショット 2023-01-24 16.26.03.png

シャドウデータベースを作成する

この問題はissueが立っているので今後解消されて、シャドウデータベースを作成する必要がなくなる可能性があります。

Prismaのマイグレーションはpostgresデータベースを削除しようする影響で、Supabaseデータベースとの競合を引き起こす可能性があります。その回避策として今回は、Prisma Shadow Databasesを使用する為、シャドウデータベースを作成します。

スクリーンショット 2023-01-24 16.55.44.png

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に以下のようなスキーマを定義します。
モデルは今回適当に用意したものを使います。

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]は適宜書き換えてください。

.env
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を確認するとスキーマ定義どおりにテーブルが作成されているのがわかります。

スクリーンショット 2023-01-24 17.12.18.png

SvelteKit + Prismaを使ってデータ取得、表示

src/lib/server/prisma.tsを作成します。
SvelteKitではファイル名に.serverをつけるかsrc/lib/server内にファイルを置くことでサーバーでのみ実行できるように制限することができます。

src/lib/server/prisma.ts
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

export default prisma;

まずはデータを取得します。src/routes/+page.server.tsを作成します。
PrismaのfindMany()を使ってuserテーブルから複数のレコードを取得して返します。

src/routes/+page.server.ts
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からいくつかデータを追加しておきましょう。

スクリーンショット 2023-01-24 17.39.37.png

最後に出力側です。src/routes/+page.svelteを編集します。
+page.server.tsで取得して返したデータがdataに格納されているのでdataからusersを取り出して表示させてみます。

src/routes/+page.svelte
<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を使ってデータを取得、表示することができました!
スクリーンショット 2023-01-24 17.44.02.png

おわりに

すごく簡単にSvelteKit + Prisma + Supabaseで開発できる環境をセットアップすることができました!
これからSvelteKitで開発してみたいよという方は是非参考にしてみてください!

25
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
19