Skip to content

Neon ist ein vollständig verwaltetes serverless Postgres, das Compute und Storage trennt, um Funktionen wie Autoscaling, Branching und bodenlosen Speicher zu bieten. Neon kann direkt von Bun aus mit dem @neondatabase/serverless-Treiber oder über ein ORM wie Drizzle verwendet werden.

Drizzle ORM unterstützt sowohl eine SQL-ähnliche "Query Builder"-API als auch eine ORM-ähnliche Queries API. Beginnen Sie, indem Sie ein Projektverzeichnis erstellen, das Verzeichnis mit bun init initialisieren und Drizzle und den Neon serverless driver installieren.

sh
mkdir bun-drizzle-neon
cd bun-drizzle-neon
bun init -y
bun add drizzle-orm @neondatabase/serverless
bun add -D drizzle-kit

Erstellen Sie eine .env.local-Datei und fügen Sie Ihre Neon Postgres-Verbindungszeichenfolge hinzu.

ini
DATABASE_URL=postgresql://usertitle:password@ep-adj-noun-guid.us-east-1.aws.neon.tech/neondb?sslmode=require

Wir verbinden uns mit der Neon-Datenbank mithilfe des Neon serverless-Treibers, eingebettet in eine Drizzle-Datenbankinstanz.

ts
import { neon } from "@neondatabase/serverless";
import { drizzle } from "drizzle-orm/neon-http";

// Bun lädt automatisch die DATABASE_URL aus .env.local
// Siehe: https://bun.com/docs/runtime/environment-variables für weitere Informationen
const sql = neon(process.env.DATABASE_URL!);

export const db = drizzle(sql);

Um die Datenbank in Aktion zu sehen, fügen Sie diese Zeilen zu index.ts hinzu.

ts
import { db } from "./db";
import { sql } from "drizzle-orm";

const query = sql`select 'hello world' as text`;
const result = await db.execute(query);
console.log(result.rows);

Führen Sie dann index.ts mit Bun aus.

sh
bun run index.ts
txt
[
  {
    text: "hello world",
  }
]

Wir können ein Schema für unsere Datenbank mit Drizzle ORM-Primitiven definieren. Erstellen Sie eine schema.ts-Datei und fügen Sie diesen Code hinzu.

ts
import { pgTable, integer, serial, text, timestamp } from "drizzle-orm/pg-core";

export const authors = pgTable("authors", {
  id: serial("id").primaryKey(),
  title: text("name").notNull(),
  bio: text("bio"),
  createdAt: timestamp("created_at").notNull().defaultNow(),
});

Wir verwenden dann die drizzle-kit-CLI, um eine initiale SQL-Migration zu generieren.

sh
bunx drizzle-kit generate --dialect postgresql --schema ./schema.ts --out ./drizzle

Dies erstellt ein neues drizzle-Verzeichnis, das eine .sql-Migrationsdatei und ein meta-Verzeichnis enthält.

txt
drizzle
├── 0000_aspiring_post.sql
└── meta
    ├── 0000_snapshot.json
    └── _journal.json

Wir können diese Migrationen mit einem einfachen migrate.ts-Skript ausführen. Dieses Skript erstellt eine neue Verbindung zur Neon-Datenbank und führt alle nicht ausgeführten Migrationen im drizzle-Verzeichnis aus.

ts
import { db } from "./db";
import { migrate } from "drizzle-orm/neon-http/migrator";

const main = async () => {
  try {
    await migrate(db, { migrationsFolder: "drizzle" });
    console.log("Migration abgeschlossen");
  } catch (error) {
    console.error("Fehler während der Migration:", error);
    process.exit(1);
  }
};

main();

Wir können dieses Skript mit bun ausführen, um die Migration auszuführen.

sh
bun run migrate.ts
txt
Migration abgeschlossen

Wir können jetzt einige Daten zu unserer Datenbank hinzufügen. Erstellen Sie eine seed.ts-Datei mit dem folgenden Inhalt.

ts
import { db } from "./db";
import * as schema from "./schema";

async function seed() {
  await db.insert(schema.authors).values([
    {
      title: "J.R.R. Tolkien",
      bio: "Der Schöpfer von Mittelerde und Autor von Der Herr der Ringe.",
    },
    {
      title: "George R.R. Martin",
      bio: "Der Autor der epischen Fantasy-Serie Das Lied von Eis und Feuer.",
    },
    {
      title: "J.K. Rowling",
      bio: "Die Schöpferin der Harry-Potter-Serie.",
    },
  ]);
}

async function main() {
  try {
    await seed();
    console.log("Seeding abgeschlossen");
  } catch (error) {
    console.error("Fehler während des Seedings:", error);
    process.exit(1);
  }
}

main();

Führen Sie dann diese Datei aus.

sh
bun run seed.ts
txt
Seeding abgeschlossen

Wir haben jetzt eine Datenbank mit einem Schema und Beispieldaten. Wir können Drizzle verwenden, um sie abzufragen. Ersetzen Sie den Inhalt von index.ts durch den folgenden.

ts
import * as schema from "./schema";
import { db } from "./db";

const result = await db.select().from(schema.authors);
console.log(result);

Führen Sie dann die Datei aus. Sie sollten die drei Autoren sehen, die wir eingefügt haben.

sh
bun run index.ts
txt
[
  {
    id: 1,
    title: "J.R.R. Tolkien",
    bio: "Der Schöpfer von Mittelerde und Autor von Der Herr der Ringe.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 2,
    title: "George R.R. Martin",
    bio: "Der Autor der epischen Fantasy-Serie Das Lied von Eis und Feuer.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 3,
    title: "J.K. Rowling",
    bio: "Die Schöpferin der Harry-Potter-Serie.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }
]

Dieses Beispiel verwendete die SQL-over-HTTP-Funktionalität des Neon serverless-Treibers. Der serverless-Treiber von Neon bietet auch Client- und Pool-Konstruktoren, um Sitzungen, interaktive Transaktionen und node-postgres-Kompatibilität zu ermöglichen. Lesen Sie die Neon-Dokumentation für eine vollständige Übersicht.

Lesen Sie die Drizzle-Website für weitere Dokumentation zur Verwendung von Drizzle ORM.

Bun von www.bunjs.com.cn bearbeitet