Skip to content

Neon è un Postgres serverless completamente gestito, che separa calcolo e archiviazione per offrire funzionalità come autoscaling, branching e archiviazione illimitata. Neon può essere usato direttamente da Bun usando il driver @neondatabase/serverless o attraverso un ORM come Drizzle.

Drizzle ORM supporta sia un'API "query builder" simile a SQL sia un'API Queries API simile a un ORM. Inizia creando una directory di progetto, inizializzando la directory con bun init e installando Drizzle e il driver serverless di Neon.

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

Crea un file .env.local e aggiungi la tua stringa di connessione a Neon Postgres.

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

Ci connetteremo al database Neon usando il driver serverless di Neon, avvolto in un'istanza di database Drizzle.

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

// Bun carica automaticamente DATABASE_URL da .env.local
// Consulta: https://bun.com/docs/runtime/environment-variables per ulteriori informazioni
const sql = neon(process.env.DATABASE_URL!);

export const db = drizzle(sql);

Per vedere il database in azione, aggiungi queste righe a index.ts.

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);

Poi esegui index.ts con Bun.

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

Possiamo definire uno schema per il nostro database usando i primitivi Drizzle ORM. Crea un file schema.ts e aggiungi questo codice.

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(),
});

Poi usiamo la CLI drizzle-kit per generare una migrazione SQL iniziale.

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

Questo crea una nuova directory drizzle contenente un file di migrazione .sql e la directory meta.

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

Possiamo eseguire queste migrazioni con un semplice script migrate.ts. Questo script crea una nuova connessione al database Neon ed esegue tutte le migrazioni non eseguite nella directory drizzle.

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

const main = async () => {
  try {
    await migrate(db, { migrationsFolder: "drizzle" });
    console.log("Migrazione completata");
  } catch (error) {
    console.error("Errore durante la migrazione:", error);
    process.exit(1);
  }
};

main();

Possiamo eseguire questo script con bun per eseguire la migrazione.

sh
bun run migrate.ts
txt
Migrazione completata

Ora possiamo aggiungere alcuni dati al nostro database. Crea un file seed.ts con il seguente contenuto.

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: "Il creatore della Terra di Mezzo e autore de Il Signore degli Anelli.",
    },
    {
      title: "George R.R. Martin",
      bio: "L'autore dell'epica serie fantasy Il Trono di Spade.",
    },
    {
      title: "J.K. Rowling",
      bio: "La creatrice della serie Harry Potter.",
    },
  ]);
}

async function main() {
  try {
    await seed();
    console.log("Seed completato");
  } catch (error) {
    console.error("Errore durante il seeding:", error);
    process.exit(1);
  }
}

main();

Poi esegui questo file.

sh
bun run seed.ts
txt
Seed completato

Ora abbiamo un database con uno schema e dati di esempio. Possiamo usare Drizzle per fare query. Sostituisci il contenuto di index.ts con quanto segue.

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

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

Poi esegui il file. Dovresti vedere i tre autori che abbiamo inserito.

sh
bun run index.ts
txt
[
  {
    id: 1,
    title: "J.R.R. Tolkien",
    bio: "Il creatore della Terra di Mezzo e autore de Il Signore degli Anelli.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 2,
    title: "George R.R. Martin",
    bio: "L'autore dell'epica serie fantasy Il Trono di Spade.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 3,
    title: "J.K. Rowling",
    bio: "La creatrice della serie Harry Potter.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }
]

Questo esempio ha usato la funzionalità SQL-over-HTTP del driver serverless di Neon. Il driver serverless di Neon espone anche i costruttori Client e Pool per abilitare sessioni, transazioni interattive e compatibilità con node-postgres. Consulta la documentazione di Neon per una panoramica completa.

Consulta il sito web di Drizzle per ulteriore documentazione sull'uso di Drizzle ORM.

Bun a cura di www.bunjs.com.cn