Skip to content

Neon هو Postgres بدون خادم مُدار بالكامل، يفصل الحساب والتخزين لتقديم ميزات مثل التوسع التلقائي والتفرع والتخزين غير المحدود. يمكن استخدام Neon من Bun مباشرة باستخدام برنامج التشغيل @neondatabase/serverless أو عبر ORM مثل Drizzle.

يدعم Drizzle ORM كل من API "منشئ الاستعلامات" الشبيه بـ SQL و API الاستعلامات الشبيه بـ ORM. ابدأ بإنشاء دليل مشروع وتهيئة الدليل باستخدام bun init وتثبيت Drizzle و برنامج تشغيل Neon serverless.

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

ثم نستخدم سطر أوامر 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("Migration completed");
  } catch (error) {
    console.error("Error during migration:", error);
    process.exit(1);
  }
};

main();

يمكننا تشغيل هذا النص باستخدام bun لتنفيذ الترحيل.

sh
bun run migrate.ts
txt
Migration completed

يمكننا الآن إضافة بعض البيانات إلى قاعدة البيانات الخاصة بنا. أنشئ ملف 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: "The creator of Middle-earth and author of The Lord of the Rings.",
    },
    {
      title: "George R.R. Martin",
      bio: "The author of the epic fantasy series A Song of Ice and Fire.",
    },
    {
      title: "J.K. Rowling",
      bio: "The creator of the Harry Potter series.",
    },
  ]);
}

async function main() {
  try {
    await seed();
    console.log("Seeding completed");
  } catch (error) {
    console.error("Error during seeding:", error);
    process.exit(1);
  }
}

main();

ثم قم بتشغيل هذا الملف.

sh
bun run seed.ts
txt
Seeding completed

أصبح لدينا الآن قاعدة بيانات مع مخطط وبيانات نموذجية. يمكننا استخدام 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: "The creator of Middle-earth and author of The Lord of the Rings.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 2,
    title: "George R.R. Martin",
    bio: "The author of the epic fantasy series A Song of Ice and Fire.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }, {
    id: 3,
    title: "J.K. Rowling",
    bio: "The creator of the Harry Potter series.",
    createdAt: 2024-05-11T10:28:46.029Z,
  }
]

استخدم هذا المثال وظيفة SQL-over-HTTP الخاصة ببرنامج تشغيل Neon serverless. يعرض برنامج تشغيل Neon serverless أيضًا منشئات Client و Pool لتمكين الجلسات والمعاملات التفاعلية والتوافق مع node-postgres. راجع وثائق Neon للحصول على نظرة عامة كاملة.

راجع موقع Drizzle للحصول على مزيد من الوثائق حول استخدام Drizzle ORM.

Bun بواسطة www.bunjs.com.cn تحرير