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:
npm i prisma --save-devInstalliere die für Prisma Postgres erforderliche Prisma-Client-Erweiterung:
npm i @prisma/extension-accelerateInitialisiere Prisma mit einer Instanz von Prisma Postgres:
npx prisma@latest init --dbWenn 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
prismamit der Dateischema.prisma, in der du dein Datenbankschema definierst. - Eine Datei
.envim Projektstammverzeichnis mit der Prisma-Postgres-Datenbank-URLDATABASE_URL=<your-prisma-postgres-database-url>.
Erstelle eine Datei .dev.vars und speichere darin die DATABASE_URL:
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:
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:
npx prisma migrate devErstelle eine Funktion wie diese, die du später in deinem Projekt verwenden kannst:
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:
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.
npm install prisma --save-dev
npx prisma init
npm install @prisma/client
npm install @prisma/adapter-d1Anschließend generiert Prisma das Schema für deine Datenbank. Definiere ein einfaches Modell in prisma/schema.prisma. Vergiss nicht, den Adapter zu ändern.
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.
npx wrangler d1 create __DATABASE_NAME__ // change it with yoursStelle sicher, dass deine Datenbank als Binding in wrangler.toml eingetragen ist.
[[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.
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.sqlMigriere das Datenbankmodell nach D1.
npx wrangler d1 migrations apply __DATABASE_NAME__ --local
npx wrangler d1 migrations apply __DATABASE_NAME__ --remote
npx prisma generatePrisma Client konfigurieren
Um deine D1-Datenbank mit Prisma abzufragen, musst du mit folgendem Befehl Typen hinzufügen:
npx wrangler typesDabei 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.
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 prismaClientsHono mit den Wrangler-Umgebungswerten verbinden:
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'
type Bindings = {
MY_KV: KVNamespace
DB: D1Database
}
const app = new Hono<{ Bindings: Bindings }>() // binding env valueBeispiel für die Verwendung in einer Hono-Route:
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 appDies 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:
- Füge deinen Abfragen Caching hinzu.
- Lies die Prisma-Postgres-Dokumentation.