Neon هو Postgres بدون خادم مُدار بالكامل، يفصل الحساب والتخزين لتقديم ميزات مثل التوسع التلقائي والتفرع والتخزين غير المحدود. يمكن استخدام Neon من Bun مباشرة باستخدام برنامج التشغيل @neondatabase/serverless أو عبر ORM مثل Drizzle.
يدعم Drizzle ORM كل من API "منشئ الاستعلامات" الشبيه بـ SQL و API الاستعلامات الشبيه بـ ORM. ابدأ بإنشاء دليل مشروع وتهيئة الدليل باستخدام bun init وتثبيت Drizzle و برنامج تشغيل Neon serverless.
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 إليه.
DATABASE_URL=postgresql://usertitle:password@ep-adj-noun-guid.us-east-1.aws.neon.tech/neondb?sslmode=requireسنقوم بالاتصال بقاعدة بيانات Neon باستخدام برنامج تشغيل Neon serverless، مغلفًا في مثيل قاعدة بيانات Drizzle.
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.
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.
bun run index.ts[
{
text: "hello world",
}
]يمكننا تحديد مخطط لقاعدة البيانات الخاصة بنا باستخدام بدائيات Drizzle ORM. أنشئ ملف schema.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 أولي.
bunx drizzle-kit generate --dialect postgresql --schema ./schema.ts --out ./drizzleينشئ هذا دليل drizzle جديد يحتوي على ملف ترحيل .sql ودليل meta.
drizzle
├── 0000_aspiring_post.sql
└── meta
├── 0000_snapshot.json
└── _journal.jsonيمكننا تنفيذ عمليات الترحيل هذه باستخدام نص migrate.ts بسيط. ينشئ هذا النص اتصالاً جديدًا بقاعدة بيانات Neon وينفذ جميع عمليات الترحيل غير المنفذة في دليل drizzle.
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 لتنفيذ الترحيل.
bun run migrate.tsMigration completedيمكننا الآن إضافة بعض البيانات إلى قاعدة البيانات الخاصة بنا. أنشئ ملف seed.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();ثم قم بتشغيل هذا الملف.
bun run seed.tsSeeding completedأصبح لدينا الآن قاعدة بيانات مع مخطط وبيانات نموذجية. يمكننا استخدام Drizzle للاستعلام عنها. استبدل محتويات index.ts بالتالي.
import * as schema from "./schema";
import { db } from "./db";
const result = await db.select().from(schema.authors);
console.log(result);ثم قم بتشغيل الملف. يجب أن ترى المؤلفين الثلاثة الذين أدخلناهم.
bun run index.ts[
{
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.