Skip to content

Neon é um Postgres serverless totalmente gerenciado que separa computação e armazenamento para oferecer recursos como auto-scaling, branching e armazenamento ilimitado. O Neon pode ser usado diretamente do Bun usando o driver @neondatabase/serverless ou através de um ORM como o Drizzle.

O Drizzle ORM suporta tanto uma API de "query builder" semelhante a SQL quanto uma Queries API semelhante a ORM. Comece criando um diretório de projeto, inicializando o diretório com bun init e instalando o Drizzle e o driver serverless do Neon.

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

Crie um arquivo .env.local e adicione sua string de conexão do Neon Postgres a ele.

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

Conectaremos ao banco de dados Neon usando o driver serverless do Neon, encapsulado em uma instância de banco de dados Drizzle.

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

// O Bun carrega automaticamente o DATABASE_URL do .env.local
// Consulte: https://bun.com/docs/runtime/environment-variables para mais informações
const sql = neon(process.env.DATABASE_URL!);

export const db = drizzle(sql);

Para ver o banco de dados em ação, adicione estas linhas ao 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);

Em seguida, execute index.ts com Bun.

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

Podemos definir um schema para nosso banco de dados usando primitivos do Drizzle ORM. Crie um arquivo schema.ts e adicione este código.

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

Em seguida, usamos a CLI drizzle-kit para gerar uma migração SQL inicial.

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

Isso cria um novo diretório drizzle contendo um arquivo de migração .sql e um diretório meta.

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

Podemos executar essas migrações com um simples script migrate.ts. Este script cria uma nova conexão com o banco de dados Neon e executa todas as migrações não executadas no diretório 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("Migração concluída");
  } catch (error) {
    console.error("Erro durante a migração:", error);
    process.exit(1);
  }
};

main();

Podemos executar este script com bun para executar a migração.

sh
bun run migrate.ts
txt
Migração concluída

Agora podemos adicionar alguns dados ao nosso banco de dados. Crie um arquivo seed.ts com o seguinte conteúdo.

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: "O criador da Terra Média e autor de O Senhor dos Anéis.",
    },
    {
      title: "George R.R. Martin",
      bio: "O autor da épica série de fantasia A Song of Ice and Fire.",
    },
    {
      title: "J.K. Rowling",
      bio: "A criadora da série Harry Potter.",
    },
  ]);
}

async function main() {
  try {
    await seed();
    console.log("Seeding concluído");
  } catch (error) {
    console.error("Erro durante o seeding:", error);
    process.exit(1);
  }
}

main();

Em seguida, execute este arquivo.

sh
bun run seed.ts
txt
Seeding concluído

Agora temos um banco de dados com um schema e dados de exemplo. Podemos usar o Drizzle para consultá-lo. Substitua o conteúdo de index.ts pelo seguinte.

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

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

Em seguida, execute o arquivo. Você deve ver os três autores que inserimos.

sh
bun run index.ts
txt
[
  {
    id: 1,
    title: "J.R.R. Tolkien",
    bio: "O criador da Terra Média e autor de O Senhor dos Anéis.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 2,
    title: "George R.R. Martin",
    bio: "O autor da épica série de fantasia A Song of Ice and Fire.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 3,
    title: "J.K. Rowling",
    bio: "A criadora da série Harry Potter.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }
]

Este exemplo usou a funcionalidade SQL-over-HTTP do driver serverless do Neon. O driver serverless do Neon também expõe os construtores Client e Pool para permitir sessões, transações interativas e compatibilidade com node-postgres. Consulte a documentação do Neon para uma visão geral completa.

Consulte o site do Drizzle para mais documentação sobre o uso do Drizzle ORM.

Bun by www.bunjs.com.cn edit