Zum Inhalt springen

Prisma auf Cloudflare Workers verwenden ​

Prisma ORM bietet ein modernes, robustes Werkzeugset für die Arbeit mit Datenbanken. Zusammen mit Hono und Cloudflare Workers ermöglicht es dir, leistungsfähige serverlose Anwendungen am Edge bereitzustellen.

In dieser Anleitung behandeln wir zwei unterschiedliche Ansätze für die Verwendung von Prisma ORM in Hono:

  • Prisma Postgres: Eine verwaltete, serverlose PostgreSQL-Datenbank mit Prisma-Integration. Dieser Ansatz eignet sich für eine produktionsreife Einrichtung, da Prisma Postgres integriertes Connection-Pooling ohne Kaltstarts bietet und damit Skalierungsprobleme in serverlosen und Edge-Umgebungen abmildert.

  • Treiberadapter: Eine Alternative mit den flexiblen Treiberadaptern von Prisma, mit denen du jede von Prisma ORM unterstützte Datenbank anbinden kannst.

Beide Ansätze haben eigene Vorteile. Du kannst denjenigen wählen, der am besten zu den Anforderungen deines Projekts passt.

Prisma Postgres verwenden ​

Prisma Postgres ist eine verwaltete, serverlose PostgreSQL-Datenbank auf Basis von Unikernels. Sie unterstützt Funktionen wie Connection-Pooling, Caching und Empfehlungen zur Abfrageoptimierung. Für die anfängliche Entwicklung, Tests und Hobbyprojekte steht ein großzügiges kostenloses Kontingent bereit.

1. Prisma und erforderliche Abhängigkeiten installieren ​

Installiere Prisma in deinem Hono-Projekt:

bash
npm i prisma --save-dev

Installiere die für Prisma Postgres erforderliche Prisma-Client-Erweiterung:

sh
npm i @prisma/extension-accelerate

Initialisiere Prisma mit einer Instanz von Prisma Postgres:

bash
npx prisma@latest init --db

Wenn du noch kein Konto auf der Prisma Data Platform hast oder nicht angemeldet bist, fordert dich der Befehl auf, dich über einen der verfügbaren Authentifizierungsanbieter anzumelden. Ein Browserfenster öffnet sich, in dem du dich anmelden oder ein Konto erstellen kannst. Kehre danach zur CLI zurück.

Nach der Anmeldung (oder wenn du bereits angemeldet warst) fordert dich die CLI auf, einen Projektnamen und eine Datenbankregion auszuwählen.

Nach Abschluss des Befehls wurden folgende Elemente erstellt:

  • Ein Projekt in deiner Plattformkonsole, das eine Prisma-Postgres-Datenbankinstanz enthält.
  • Ein Ordner prisma mit der Datei schema.prisma, in der du dein Datenbankschema definierst.
  • Eine Datei .env im Projektstammverzeichnis mit der Prisma-Postgres-Datenbank-URL DATABASE_URL=<your-prisma-postgres-database-url>.

Erstelle eine Datei .dev.vars und speichere darin die DATABASE_URL:

bash
DATABASE_URL="your_prisma_postgres_url"

Behalte die Datei .env, damit die Prisma CLI später darauf zugreifen kann, um Migrationen auszuführen, den Prisma Client zu generieren oder Prisma Studio zu öffnen.

2. Prisma in deinem Projekt einrichten ​

Öffne nun die Datei schema.prisma und definiere die Modelle für dein Datenbankschema. Zum Beispiel kannst du ein Modell User hinzufügen:

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

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id  Int @id @default(autoincrement())
  email String
  name 	String
}

Verwende Prisma Migrate, um Änderungen auf die Datenbank anzuwenden:

bash
npx prisma migrate dev

Erstelle eine Funktion wie diese, die du später in deinem Projekt verwenden kannst:

ts
import { PrismaClient } from '@prisma/client/edge'
import { withAccelerate } from '@prisma/extension-accelerate'

export const getPrisma = (database_url: string) => {
  const prisma = new PrismaClient({
    datasourceUrl: database_url,
  }).$extends(withAccelerate())
  return prisma
}

Hier ist ein Beispiel für die Verwendung dieser Funktion in deinem Projekt:

ts
import { Hono } from 'hono'
import { sign, verify } from 'hono/jwt'
import { getPrisma } from '../usefulFun/prismaFun'

// Create the main Hono app
const app = new Hono<{
  Bindings: {
    DATABASE_URL: string
    JWT_SECRET: string
  }
  Variables: {
    userId: string
  }
}>()

app.post('/', async (c) => {
  // Now you can use it wherever you want
  const prisma = getPrisma(c.env.DATABASE_URL)
})

Wenn du deine eigene Datenbank mit Prisma ORM verwenden und von Connection-Pooling und Edge-Caching profitieren möchtest, kannst du Prisma Accelerate aktivieren. Weitere Informationen zur Einrichtung in deinem Projekt findest du unter Prisma Accelerate.

Prisma-Treiberadapter verwenden ​

Prisma lässt sich über driverAdapters mit der D1-Datenbank verwenden. Voraussetzung ist, Prisma zu installieren und Wrangler zu integrieren, um die Bindings mit deinem Hono-Projekt einzurichten. Hier wird ein Beispielprojekt gezeigt, weil die Dokumentation zu Hono, Prisma und Cloudflare D1 getrennt vorliegt und keine zusammenhängende, genaue Schritt-für-Schritt-Anleitung bietet.

Prisma einrichten ​

Prisma und D1 verwenden ein Binding in Wrangler, um über einen Adapter eine Verbindung herzustellen.

bash
npm install prisma --save-dev
npx prisma init
npm install @prisma/client
npm install @prisma/adapter-d1

Anschließend generiert Prisma das Schema für deine Datenbank. Definiere ein einfaches Modell in prisma/schema.prisma. Vergiss nicht, den Adapter zu ändern.

prisma/schema.prisma
ts
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["driverAdapters"] // change from default
}

datasource db {
  provider = "sqlite" // d1 is sql base database
  url      = env("DATABASE_URL")
}

// Create a simple model database
model User {
  id    String @id  @default(uuid())
  email String  @unique
  name  String?
}

D1-Datenbank ​

Wenn du bereits eine D1-Datenbank eingerichtet hast, überspringe diesen Schritt. Andernfalls erstelle eine Datenbank; die Anleitung findest du hier.

bash
npx wrangler d1 create __DATABASE_NAME__ // change it with yours

Stelle sicher, dass deine Datenbank als Binding in wrangler.toml eingetragen ist.

wrangler.toml
toml
[[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "__DATABASE_NAME__"
database_id = "DATABASE ID"

Prisma Migrate ​

Dieser Befehl führt die Prisma-Migration aus und aktualisiert die lokale oder entfernte D1-Datenbank.

bash
npx wrangler d1 migrations create __DATABASE_NAME__ create_user_table # will generate migration folder and sql file

// for generate sql statement

npx prisma migrate diff \
  --from-empty \
  --to-schema-datamodel ./prisma/schema.prisma \
  --script \
  --output migrations/0001_create_user_table.sql

Migriere das Datenbankmodell nach D1.

bash
npx wrangler d1 migrations apply __DATABASE_NAME__ --local
npx wrangler d1 migrations apply __DATABASE_NAME__ --remote
npx prisma generate

Prisma Client konfigurieren ​

Um deine D1-Datenbank mit Prisma abzufragen, musst du mit folgendem Befehl Typen hinzufügen:

bash
npx wrangler types

Dabei wird eine Datei worker-configuration.d.ts generiert.

Prisma-Clients ​

Um Prisma global zu verwenden, erstelle eine Datei lib/prismaClient.ts mit Code wie diesem.

ts
import { PrismaClient } from '@prisma/client'
import { PrismaD1 } from '@prisma/adapter-d1'

const prismaClients = {
  async fetch(db: D1Database) {
    const adapter = new PrismaD1(db)
    const prisma = new PrismaClient({ adapter })
    return prisma
  },
}

export default prismaClients

Hono mit den Wrangler-Umgebungswerten verbinden:

ts
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'

type Bindings = {
  MY_KV: KVNamespace
  DB: D1Database
}

const app = new Hono<{ Bindings: Bindings }>() // binding env value

Beispiel für die Verwendung in einer Hono-Route:

ts
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'

type Bindings = {
  MY_KV: KVNamespace
  DB: D1Database
}
const app = new Hono<{ Bindings: Bindings }>()

app.get('/', async (c) => {
  const prisma = await prismaClients.fetch(c.env.DB)
  const users = await prisma.user.findMany()
  console.log('users', users)
  return c.json(users)
})

export default app

Dies gibt auf der Route / alle Benutzer zurück. Du kannst das Ergebnis mit Postman oder Thunder Client ansehen.

Ressourcen ​

Mit folgenden Ressourcen kannst du deine Anwendung weiter verbessern:

Veröffentlicht unter der MIT-Lizenz.