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.
mkdir bun-drizzle-neon
cd bun-drizzle-neon
bun init -y
bun add drizzle-orm @neondatabase/serverless
bun add -D drizzle-kitCrea un file .env.local e aggiungi la tua stringa di connessione a Neon Postgres.
DATABASE_URL=postgresql://usertitle:password@ep-adj-noun-guid.us-east-1.aws.neon.tech/neondb?sslmode=requireCi connetteremo al database Neon usando il driver serverless di Neon, avvolto in un'istanza di database Drizzle.
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.
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.
bun run index.ts[
{
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.
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.
bunx drizzle-kit generate --dialect postgresql --schema ./schema.ts --out ./drizzleQuesto crea una nuova directory drizzle contenente un file di migrazione .sql e la directory meta.
drizzle
├── 0000_aspiring_post.sql
└── meta
├── 0000_snapshot.json
└── _journal.jsonPossiamo 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.
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.
bun run migrate.tsMigrazione completataOra possiamo aggiungere alcuni dati al nostro database. Crea un file seed.ts con il seguente contenuto.
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.
bun run seed.tsSeed completatoOra 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.
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.
bun run index.ts[
{
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.