قاعدة البيانات
يستخدم قالب حسنات Cloudflare D1، وهي قاعدة بيانات SQLite تعمل مع Cloudflare. لكل تطبيق قاعدته الخاصة.
قاعدتك أو قاعدة من حسنات
رابط قسم «قاعدتك أو قاعدة من حسنات»- في حسابك على Cloudflare: أنشئ القاعدة بنفسك بالخطوات أدناه. يناسبك هذا إن كنت تنشر التطبيق من حسابك.
- في حساب حسنات: إن كان تطبيقك سيعمل في حساب حسنات على Cloudflare، فاطلب «قاعدة بيانات» من لوحة المنصة. ينشئها مسؤول الخدمات ويرسل لك اسمها ومعرّفها في ملاحظة الطلب. الاسم والمعرّف ليسا سرّين، ولا ترسل أي سرّ في الطلب. اتفق معه في الطلب نفسه على من يطبّق تغييرات المخطّط على القاعدة.
قاعدة hasanat-db المشتركة خاصة بـ hasanat.dev وهذه المنصة، ومخطّطها في مستودع hasanat. لا تستخدمها لتطبيق مشروعك.
الإعداد في القالب
رابط قسم «الإعداد في القالب»-
أنشئ القاعدة. يطبع الأمر معرّفها
database_id:نافذة طرفيّة npx wrangler d1 create your-app-db -
أضف الربط إلى
wrangler.toml:[[d1_databases]]binding = "DB"database_name = "your-app-db"database_id = "paste-your-database-id-here" -
عدّل
schema.sqlبما يحتاجه تطبيقك. -
ضع اسم قاعدتك مكان
YOUR_DB_NAMEفي أمريdb:migrate:localوdb:migrate:prodفيpackage.json، ثم طبّق المخطّط على القاعدة المحلية:نافذة طرفيّة npm run db:migrate:localالأمر
npm run db:migrate:prodيطبّقه على قاعدة الإنتاج. لا تشغّله قبل مراجعة التغيير.
تغييرات المخطّط بعد الإطلاق
رابط قسم «تغييرات المخطّط بعد الإطلاق»ملف schema.sql الواحد يكفي في البداية. حين يصبح للقاعدة بيانات حقيقية، احفظ كل تغيير في ملف ترحيل مستقل، ليبقى تاريخ التغييرات واضحًا:
npx wrangler d1 migrations create your-app-db add-itemsnpx wrangler d1 migrations apply your-app-db --localnpx wrangler d1 migrations apply your-app-db --remoteالاستخدام في الكود
رابط قسم «الاستخدام في الكود»import { getDB, queryAll, queryOne, execute } from "@/lib/db";
const db = getDB(Astro.locals);
const items = await queryAll(db, "SELECT * FROM items WHERE status = ?", "active");const item = await queryOne(db, "SELECT * FROM items WHERE id = ?", id);await execute(db, "INSERT INTO items (title_ar, created_by) VALUES (?, ?)", title, user.id);يستخدم القالب Astro 5، فيقرأ الربط من Astro.locals.runtime.env. في Astro 6 وما بعده أُزيل Astro.locals.runtime، فاستورد env من cloudflare:workers واستخدم env.DB.
اصطلاحات المخطّط
رابط قسم «اصطلاحات المخطّط»- أعمدة ثنائية اللغة لكل نص يظهر للمستخدم:
title_arوtitle_en. - التواريخ نصًّا بالقيمة الافتراضية
datetime('now'). - قيود
CHECKلحقول الحالة. created_byنصًّا، ويحمل معرّف المستخدم من تسجيل الدخول.- فهارس على الأعمدة التي تصفّي بها أو ترتّب بها كثيرًا.
الأمان
رابط قسم «الأمان»- استخدم الاستعلامات ذات المعاملات دائمًا، ولا تدمج مدخلات المستخدم في نص SQL.
- تحقّق من المدخلات بـ zod قبل الكتابة.
- تأكّد من تسجيل الدخول قبل أي كتابة، ولا تُرجع إلا البيانات التي يحق للمستخدم رؤيتها.
- لا تضع في الاختبارات أو البيانات التجريبية أسماء أو أرقامًا حقيقية.
// صحيح: استعلام بمعاملاتawait db.prepare("SELECT * FROM items WHERE id = ?").bind(id).all();
// خطأ: عرضة لحقن SQLawait db.prepare(`SELECT * FROM items WHERE id = ${id}`).all();الحدود
رابط قسم «الحدود»بحسب توثيق Cloudflare، تتيح الخطة المجانية 5 ملايين صف مقروء و100 ألف صف مكتوب يوميًا، و5 غيغابايت تخزينًا للحساب، و500 ميغابايت للقاعدة الواحدة، و10 قواعد للحساب. راجع الصفحة الرسمية لأحدث الأرقام.