مقدمة: لماذا يعتبر TypeScript و PostgreSQL ثنائيًا مثاليًا لمشروعك
\n\nهل تساءلت يومًا لماذا يختار المطورون بشكل متزايد مزيج TypeScript و PostgreSQL؟ هذا ليس مجرد اتجاه عصري - إنه ثنائي قوي يغير قواعد اللعبة في تطوير الويب الحديث. تخيل سكينًا سويسريًا وخزنة آمنة في آن واحد: TypeScript يضفي على الكود الدقة والقابلية للتنبؤ، بينما يوفر PostgreSQL الموثوقية والمرونة في تخزين البيانات.
\n\nفي هذا الدليل، لن نمر على النظرية فقط. سنغوص في الممارسة العملية الحقيقية: سنقوم بإعداد الاتصال، كتابة الاستعلامات، إنشاء واجهات برمجة تطبيقات، وسنتعرف على كيفية تجنب الأخطاء الشائعة. هل أنت مستعد؟ لنبدأ!
\n\nإعداد البيئة: من أين تبدأ العمل مع TypeScript و PostgreSQL
\n\nقبل كتابة الكود، دعنا نجهز الأرضية. تثبيت التبعيات يشبه أساس المنزل: كلما كان أقوى، كلما طال عمر المشروع.
\n\nتثبيت الحزم الضرورية
\n\nسنحتاج إلى أداتين رئيسيتين: pg (عميل PostgreSQL) و typescript مع الأنواع. نفذ في الطرفية:
npm init -y\nnpm install pg\nnpm install -D typescript @types/node @types/pg\nnpx tsc --init\n\n\nلاحظ: نقوم بتثبيت أنواع pg بشكل منفصل. هذا شرط أساسي للعمل مع قاعدة بيانات TypeScript - وإلا سيعترض المترجم على عدم وجود الأنواع.
الهيكل الأساسي للمشروع
\n\nأنشئ ملف database.ts - سيكون هذا قلب الاتصال. إليك قالبًا بسيطًا ولكنه عملي:
import { Pool } from 'pg';\n\nconst pool = new Pool({\n user: 'your_username',\n host: 'localhost',\n database: 'your_database',\n password: 'your_password',\n port: 5432,\n});\n\nexport default pool;\n\n\nلماذا Pool وليس عميلًا عاديًا؟ Pool يدير مجموعة من الاتصالات، وهو أمر بالغ الأهمية للإنتاج. تخيل أن كل طلب هو زائر لمقهى. بدون مجموعة، ستفتح مقهى جديد لكل عميل. مع المجموعة - لديك بالفعل عدة طاولات، وتجلس الضيوف ببساطة.
العمليات الأساسية: CRUD باستخدام TypeScript مع PostgreSQL
\n\nالآن الجزء الممتع - كتابة الاستعلامات. سننشئ جدول مستخدمين بسيط وننفذ جميع العمليات الأربع: إنشاء، قراءة، تحديث، حذف.
\n\nإنشاء الجدول
\n\nقبل العمل مع البيانات، نحتاج إلى إنشاء الهيكل. إليك كيفية القيام بذلك عبر TypeScript:
\n\nimport pool from './database';\n\nasync function createTable() {\n const query = `\n CREATE TABLE IF NOT EXISTS users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(100) NOT NULL,\n email VARCHAR(255) UNIQUE NOT NULL,\n age INTEGER CHECK (age > 0),\n created_at TIMESTAMP DEFAULT NOW()\n );\n `;\n \n try {\n await pool.query(query);\n console.log('تم إنشاء جدول users');\n } catch (error) {\n console.error('خطأ:', error);\n }\n}\n\ncreateTable();\n\n\nلاحظ SERIAL - هذا هو التزايد التلقائي الذي يولده PostgreSQL بنفسه. و CHECK يضمن أن العمر سيكون موجبًا. هذا مثال على كيف يعمل PostgreSQL TypeScript معًا لضمان سلامة البيانات على مستويين.
إضافة البيانات (Create)
\n\nالإدراج مع المعاملات - طريقة آمنة لتجنب حقن SQL:
\n\ninterface User {\n name: string;\n email: string;\n age: number;\n}\n\nasync function addUser(user: User) {\n const query = `\n INSERT INTO users (name, email, age)\n VALUES ($1, $2, $3)\n RETURNING *;\n `;\n \n const values = [user.name, user.email, user.age];\n \n try {\n const result = await pool.query(query, values);\n console.log('تمت إضافة المستخدم:', result.rows[0]);\n return result.rows[0];\n } catch (error) {\n console.error('خطأ أثناء الإضافة:', error);\n throw error