AlfariziFullstack EngineerYogyakarta, Indonesia

Writing ·

Prisma ORM dan Turso (dengan Next.js 14+ App Router)

Mengelola dan men-deploy aplikasi Next.js berbasis SQLite dengan Prisma dan Turso.

Pertama diterbitkan pada 2024. Contoh mengikuti versi yang digunakan saat itu. Edisi migrasi ini tidak menyertakan screenshot dashboard dan output bantuan CLI lama. Detail koneksi diganti dengan placeholder aman.

Prisma ORM mempunyai keunggulan penulisan schema yang sederhana dan Prisma Client yang dapat digunakan di backend secara typesafe. Prisma mendukung berbagai DBMS berbasis SQL, termasuk SQLite. Jika ingin men-deploy aplikasi, kita juga perlu tempat untuk menyimpan data SQLite. Salah satu pilihan DBaaS untuk SQLite adalah Turso.

Di tulisan ini, saya akan berbagi penggunaan Turso dan Prisma pada Next.js 14+ (App Router).

Preparing

Sebelum menggunakan Turso, kita perlu melakukan setup Next.js dan Prisma.

Instalasi Next.js

Install Next.js lalu masuk ke folder aplikasinya:

npx create-next-app my-next-app
cd my-next-app

Instalasi Prisma

npm install @prisma/client
npm install prisma --save-dev
npx prisma init

Setup Prisma

Tuliskan model pada /prisma/schema.prisma:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  createdAt DateTime @default(now())
}

Jalankan proses migrasi:

npx prisma migrate dev --name init

Migrasi bernama init menghasilkan file SQL di /prisma/migrations/[date]_init/migration.sql dan Prisma Client yang bisa dipakai untuk mengakses model secara typesafe. Jika client belum dihasilkan, jalankan:

npx prisma generate

Setup Prisma dan Next.js

Buat file /src/server/db.ts:

import { PrismaClient } from "@prisma/client"

const createPrismaClient = () =>
  new PrismaClient({
    log:
      process.env.NODE_ENV === "development"
        ? ["query", "error", "warn"]
        : ["error"],
  })

const globalForPrisma = globalThis as unknown as {
  prisma: ReturnType<typeof createPrismaClient> | undefined
}

export const db = globalForPrisma.prisma ?? createPrismaClient()

if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = db

Dengan begitu, Prisma Client dapat dipanggil menggunakan variabel db.

Turso

Instalasi Turso CLI

Turso menyediakan CLI untuk mengelola dan berkomunikasi dengan database. Perintah instalasi Homebrew pada artikel asli:

brew install tursodatabase/tap/turso
turso --help

Turso login

Buka Turso dan masuk menggunakan akunmu. Saya menggunakan provider GitHub. Setelah login di browser, kembali ke terminal:

turso auth login

Turso dashboard

Masuk ke menu Databases dan pilih Create Database. Isi nama database dan group. Dalam contoh ini saya menggunakan nama testing. Setelah selesai, buka dashboard database tersebut.

Menghubungkan Prisma ke Turso

Buat file lokal .env:

TURSO_DATABASE_URL=
TURSO_AUTH_TOKEN=

Detail database dapat diperoleh dengan menjalankan:

turso db show testing

Gunakan URL dan token milikmu sendiri. Nilai di bawah ini hanya placeholder, bukan kredensial yang dapat digunakan:

TURSO_DATABASE_URL=libsql://your-database.turso.io
TURSO_AUTH_TOKEN=your-private-token

Jangan membagikan auth token atau memasukkan file .env lokal ke repository.

Prisma adapter

Untuk versi Prisma pada artikel ini, tambahkan driverAdapters pada generator:

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["driverAdapters"]
}

Ubah /src/server/db.ts untuk membuat LibSQL client dan adapter:

import { PrismaClient } from "@prisma/client"
import { PrismaLibSQL } from "@prisma/adapter-libsql"
import { createClient } from "@libsql/client"

const libsql = createClient({
  url: `${process.env.TURSO_DATABASE_URL}`,
  authToken: `${process.env.TURSO_AUTH_TOKEN}`,
})

const adapter = new PrismaLibSQL(libsql)

const createPrismaClient = () =>
  new PrismaClient({
    adapter,
    log:
      process.env.NODE_ENV === "development"
        ? ["query", "error", "warn"]
        : ["error"],
  })

const globalForPrisma = globalThis as unknown as {
  prisma: ReturnType<typeof createPrismaClient> | undefined
}

export const db = globalForPrisma.prisma ?? createPrismaClient()

if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = db

Kemudian jalankan migrasi lagi:

npx prisma migrate dev --name init

Push migration ke Turso

Workflow asli menggunakan database shell untuk mengirim SQL hasil migrasi. Sesuaikan nama database dan path migrasi dengan milikmu:

turso db shell testing < ./prisma/migrations/20240902093411_init/migration.sql

Kembali ke dashboard dan buka editor database yang tersedia. Tabel Post seharusnya sudah ada. Jika database tidak aktif, periksa status dan pengaturannya melalui dashboard.

Kesimpulan

Dengan menggabungkan Prisma dan Turso, kita dapat mengelola dan men-deploy aplikasi Next.js berbasis SQLite secara cloud-native. Turso menyediakan SQLite di cloud, sementara Prisma membantu pengelolaan schema database secara typesafe di TypeScript.