Skip to content

Neon — это полностью управляемый серверless Postgres, разделяющий вычисления и хранение для предоставления таких функций, как автомасштабирование, ветвление и бездонное хранение. Neon может использоваться напрямую из Bun с помощью драйвера @neondatabase/serverless или через ORM, такую как Drizzle.

Drizzle ORM поддерживает как SQL-подобный "query builder" API, так и ORM-подобный Queries API. Начните с создания директории проекта, инициализации директории с помощью bun init и установки Drizzle и Neon serverless driver.

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

Создайте файл .env.local и добавьте в него строку подключения к Neon Postgres.

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

Мы подключимся к базе данных Neon с помощью драйвера Neon serverless, обёрнутого в экземпляр базы данных Drizzle.

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

// Bun автоматически загружает DATABASE_URL из .env.local
// Смотрите: https://bun.com/docs/runtime/environment-variables для получения дополнительной информации
const sql = neon(process.env.DATABASE_URL!);

export const db = drizzle(sql);

Чтобы увидеть базу данных в действии, добавьте эти строки в 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);

Затем запустите index.ts с помощью Bun.

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

Мы можем определить схему для нашей базы данных, используя примитивы Drizzle ORM. Создайте файл schema.ts и добавьте этот код.

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

Затем мы используем CLI drizzle-kit для генерации начальной SQL миграции.

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

Это создаст новую директорию drizzle, содержащую файл миграции .sql и директорию meta.

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

Мы можем выполнить эти миграции с помощью простого скрипта migrate.ts. Этот скрипт создаёт новое подключение к базе данных Neon и выполняет все невыполненные миграции в директории 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("Миграция завершена");
  } catch (error) {
    console.error("Ошибка во время миграции:", error);
    process.exit(1);
  }
};

main();

Мы можем запустить этот скрипт с помощью bun для выполнения миграции.

sh
bun run migrate.ts
txt
Миграция завершена

Теперь мы можем добавить некоторые данные в нашу базу данных. Создайте файл seed.ts со следующим содержимым.

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: "Создатель Средиземья и автор Властелина Колец.",
    },
    {
      title: "George R.R. Martin",
      bio: "Автор эпической фэнтези серии Песнь Льда и Огня.",
    },
    {
      title: "J.K. Rowling",
      bio: "Создатель серии Гарри Поттер.",
    },
  ]);
}

async function main() {
  try {
    await seed();
    console.log("Заполнение данными завершено");
  } catch (error) {
    console.error("Ошибка во время заполнения данными:", error);
    process.exit(1);
  }
};

main();

Затем запустите этот файл.

sh
bun run seed.ts
txt
Заполнение данными завершено

Теперь у нас есть база данных со схемой и тестовыми данными. Мы можем использовать Drizzle для запроса к ней. Замените содержимое index.ts следующим.

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

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

Затем запустите файл. Вы должны увидеть трёх авторов, которых мы вставили.

sh
bun run index.ts
txt
[
  {
    id: 1,
    title: "J.R.R. Tolkien",
    bio: "Создатель Средиземья и автор Властелина Колец.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 2,
    title: "George R.R. Martin",
    bio: "Автор эпической фэнтези серии Песнь Льда и Огня.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 3,
    title: "J.K. Rowling",
    bio: "Создатель серии Гарри Поттер.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }
]

Этот пример использовал функциональность SQL-over-HTTP драйвера Neon serverless. Серверless драйвер Neon также предоставляет конструкторы Client и Pool для включения сессий, интерактивных транзакций и совместимости с node-postgres. Обратитесь к документации Neon для полного обзора.

Обратитесь к веб-сайту Drizzle для получения дополнительной документации по использованию Drizzle ORM.

Bun от www.bunjs.com.cn