مقدمة: لماذا TypeScript وقواعد البيانات هما الثنائي المثالي
تطوير الويب الحديث لا يمكن تصوره بدون العمل مع قواعد البيانات. TypeScript، كإضافة صارمة التوصيف فوق JavaScript، يقدم للمطورين أداة قوية لبناء تطبيقات موثوقة وقابلة للتوسع. في هذه المقالة، سنشرح عملياً كيفية ربط واستخدام أشهر قاعدتي بيانات - PostgreSQL العلائقية و MongoDB الموجهة للمستندات - في نظام TypeScript البيئي.
ستتعلم كيفية إعداد ORM/ODM، كتابة نماذج محددة الأنواع، وتنفيذ عمليات CRUD الأساسية. المادة موجهة للمطورين الذين هم على دراية بأساسيات TypeScript و Node.js.
1. إعداد المشروع وتثبيت التبعيات
قبل كتابة الكود، سننشئ مشروعاً جديداً ونثبت الحزم اللازمة. للعمل مع PostgreSQL، سنستخدم TypeORM - أحد أشهر ORM لـ TypeScript. لـ MongoDB، سنستخدم Mongoose.
تهيئة المشروع
mkdir typescript-db-practicecd typescript-db-practicenpm init -ynpm install typescript ts-node @types/node --save-devnpx tsc --initتثبيت تبعيات PostgreSQL
npm install typeorm reflect-metadata pgnpm install @types/node --save-devتثبيت تبعيات MongoDB
npm install mongoosenpm install @types/mongoose --save-devبعد التثبيت، في ملف tsconfig.json تأكد من تفعيل الخيارات "experimentalDecorators": true و "emitDecoratorMetadata": true - فهي ضرورية لعمل TypeORM.
2. العمل مع PostgreSQL عبر TypeORM
يدعم TypeORM كلاً من نمطي Active Record و Data Mapper. سنستخدم Data Mapper لأنه يوفر مرونة أكبر ويتناسب بشكل أفضل مع البنية النظيفة.
إنشاء كيان (Entity)
سننشئ نموذج مستخدم. كل كيان هو كلاس مزين بتعليقات توضيحية خاصة.
// src/entities/User.tsimport { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ length: 100 }) name: string;
@Column({ unique: true }) email: string;
@Column({ select: false }) password: string;
@CreateDateColumn() createdAt: Date;}إعداد الاتصال والمستودع
سننشئ ملفاً لتهيئة قاعدة البيانات ومستودعاً للعمل مع المستخدمين.
// src/data-source.tsimport "reflect-metadata";import { DataSource } from "typeorm";import { User } from "./entities/User";
export const AppDataSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "postgres", password: "password", database: "test_db", synchronize: true, // إنشاء الجداول تلقائياً (للتطوير فقط!) logging: false, entities: [User], migrations: [], subscribers: [],});// src/repositories/userRepository.tsimport { AppDataSource } from "../data-source";import { User } from "../entities/User";
export const userRepository = AppDataSource.getRepository(User);عمليات CRUD عملياً
// src/index.tsimport { AppDataSource } from "./data-source";import { userRepository } from "./repositories/userRepository";
async function main() { await AppDataSource.initialize(); console.log("PostgreSQL connected!");
// CREATE const newUser = userRepository.create({ name: "إيفان بيتروف", email: "ivan@example.com", password: "hashed_password" }); await userRepository.save(newUser); console.log("User created:", newUser);
// READ const us