الفصل 1: PostgreSQL - التثبيت والتكوين
مقدمة
PostgreSQL هو نظام إدارة قواعد بيانات علائقية (SGBDR) مفتوح المصدر، قوي وموثوق، يُستخدم في الإنتاج في جميع أنحاء العالم من قبل شركات مثل Apple وSpotify وInstagram وReddit.
لماذا PostgreSQL؟
حتى الآن، استخدمنا H2، قاعدة بيانات مثالية للتطوير والاختبارات. ولكن لنشر تطبيق في الإنتاج، نحتاج إلى قاعدة بيانات قوية، عالية الأداء وقابلة للتوسع: PostgreSQL.
H2 مقابل PostgreSQL: فهم الفرق
جدول مقارنة
| الجانب | H2 | PostgreSQL |
|---|---|---|
| النوع | في الذاكرة/ملف محلي | خادم مخصص |
| الاستخدام | تطوير/اختبارات | إنتاج |
| الأداء | محدود | أداء عالي |
| المستخدمون المتزامنون | غير مناسب | ممتاز |
| الأدوات | وحدة تحكم أساسية | pgAdmin, DBeaver, إلخ. |
| القابلية للتوسع | ضعيف | ممتاز |
| النسخ الاحتياطي | يدوي/معقد | أصلي وآلي |
| الأمان | أساسي | متقدم (أدوار، أذونات) |
تشبيه
H2 = دراجة 🚲
- مثالي للتعلم والاختبار
- سهل البدء
- غير مناسب لنقل 100 شخص
PostgreSQL = حافلة 🚌
- مصمم للنقل الجماعي
- موثوق وقوي
- يتطلب رخصة خاصة (تكوين)
تثبيت PostgreSQL
Windows
الخطوة 1: التحميل
توجه إلى: postgresql.org/download/windows
قم بتحميل PostgreSQL 14+ (أو إصدار أحدث).
الخطوة 2: التثبيت
- قم بتشغيل المثبت
- اتبع معالج التثبيت
- مهم: احفظ كلمة مرور المستخدم
postgres(ستحتاجها!) - المنفذ الافتراضي: 5432 (اتركه كما هو)
- قم بتثبيت Stack Builder (اختياري ولكن موصى به)
الخطوة 3: التحقق
افتح محطة واكتب:
psql --version
يجب أن ترى:
psql (PostgreSQL) 14.x
macOS
عبر Homebrew:
brew install postgresql@14
brew services start postgresql@14
التحقق:
psql --version
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
الخطوات الأولى مع PostgreSQL
الاتصال بـ PostgreSQL
Windows (عبر psql):
psql -U postgres
أدخل كلمة المرور التي قمت بتعيينها أثناء التثبيت.
macOS/Linux:
sudo -u postgres psql
أوامر SQL الأساسية
1. سرد قواعد البيانات
\l
سترى القواعد الافتراضية:
postgres
template0
template1
2. إنشاء قاعدة بيانات
CREATE DATABASE greeting_db;
النتيجة:
CREATE DATABASE
3. الاتصال بقاعدة
\c greeting_db
النتيجة:
You are now connected to database "greeting_db" as user "postgres".
4. سرد الجداول
\dt
في البداية، لن يكون هناك أي جدول.
5. عرض هيكل جدول
\d nom_table
6. الخروج من psql
\q
تكوين Spring Boot لـ PostgreSQL
الخطوة 1: إضافة تبعية Maven
ملف: pom.xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
ملاحظة: يشير <scope>runtime</scope> إلى أن هذه التبعية مطلوبة فقط أثناء التشغيل، وليس أثناء الترجمة.
الخطوة 2: إنشاء قاعدة البيانات
قبل تكوين Spring Boot، قم بإنشاء قاعدة البيانات:
psql -U postgres
CREATE DATABASE greeting_db;
\q
الخطوة 3: تكوين application.yml
ملف: src/main/resources/application.yml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/greeting_db
username: postgres
password: votre_mot_de_passe
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialect
format_sql: true
التفسيرات:
| الخاصية | المعنى |
|---|---|
url | عنوان القاعدة (localhost:5432/nom_base) |
username | مستخدم PostgreSQL (افتراضي: postgres) |
password | كلمة المرور المعينة أثناء التثبيت |
driver-class-name | برنامج تشغيل JDBC لـ PostgreSQL |
ddl-auto: update | يقوم Hibernate بتحديث المخطط تلقائيًا |
show-sql: true | يعرض الاستعلامات SQL في وحدة التحكم |
dialect | لهجة SQL خاصة بـ PostgreSQL |
format_sql: true | تنسيق الاستعلامات SQL للقراءة |
اختبار الاتصال
إنشاء كيان بسيط
ملف: model/Product.java
package com.example.demo.model;
import jakarta.persistence.*;
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
// Constructeurs
public Product() {}
public Product(String name, Double price) {
this.name = name;
this.price = price;
}
// Getters et Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Double getPrice() { return price; }
public void setPrice(Double price) { this.price = price; }
}
بدء التطبيق
mvn clean install -DskipTests spring-boot:run
وحدة التحكم:
Hibernate:
create table products (
id bigserial not null,
name varchar(255),
price float8,
primary key (id)
)
✅ يقوم PostgreSQL بإنشاء الجدول تلقائيًا!
التحقق في PostgreSQL
psql -U postgres -d greeting_db
\dt
النتيجة:
List of relations
Schema | Name | Type | Owner
--------+----------+-------+----------
public | products | table | postgres
\d products
النتيجة:
Table "public.products"
Column | Type | Collation | Nullable | Default
--------+------------------------+-----------+----------+--------------------------------------
id | bigint | | not null | nextval('products_id_seq'::regclass)
name | character varying(255) | | |
price | double precision | | |
✅ الجدول موجود في PostgreSQL!
أدوات الإدارة
pgAdmin
التثبيت:
قم بالتحميل من: pgadmin.org
الاستخدام:
- افتح pgAdmin
- أنشئ اتصال خادم جديد
- الاسم:
Local PostgreSQL - المضيف:
localhost - المنفذ:
5432 - اسم المستخدم:
postgres - كلمة المرور: كلمة المرور الخاصة بك
الميزات:
- واجهة رسومية بديهية
- مستكشف قواعد البيانات
- محرر SQL
- تصور البيانات
- إدارة المستخدمين والأذونات
DBeaver
التثبيت:
قم بالتحميل من: dbeaver.io
المزايا:
- مجاني ومفتوح المصدر
- دعم لعدة قواعد بيانات (PostgreSQL, MySQL, Oracle, إلخ.)
- واجهة حديثة
- إكمال تلقائي لـ SQL
- تصور البيانات
الأمان وأفضل الممارسات
1. لا تقم أبدًا بتضمين كلمات المرور بشكل صريح
❌ سيء:
spring:
datasource:
password: monMotDePasse123
✅ جيد:
spring:
datasource:
password: ${DB_PASSWORD}
متغير البيئة (Windows):
$env:DB_PASSWORD = "monMotDePasse123"
mvn spring-boot:run
متغير البيئة (Linux/macOS):
export DB_PASSWORD="monMotDePasse123"
mvn spring-boot:run
2. إنشاء مستخدم مخصص (إنتاج)
لا تستخدم postgres في الإنتاج!
-- إنشاء مستخدم
CREATE USER myapp_user WITH PASSWORD 'secure_password';
-- إنشاء قاعدة
CREATE DATABASE myapp_db OWNER myapp_user;
-- منح الأذونات
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;
تكوين Spring Boot:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/myapp_db
username: myapp_user
password: ${DB_PASSWORD}
3. تقييد الأذونات
-- منح الأذونات الضرورية فقط
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO myapp_user;
ملخص
ما تعلمته
✅ تثبيت PostgreSQL على Windows/Mac/Linux
✅ إنشاء قواعد بيانات ومستخدمين
✅ تكوين Spring Boot لـ PostgreSQL
✅ استخدام pgAdmin وDBeaver
✅ تأمين الاتصالات باستخدام متغيرات البيئة
✅ فهم الفروق بين H2 وPostgreSQL
النقاط الرئيسية
PostgreSQL = جاهز للإنتاج
- قوي وموثوق
- أداء عالي مع العديد من المستخدمين
- أدوات إدارة احترافية
- أمان متقدم
تكوين Spring Boot = بسيط
- تبعية Maven واحدة
- ملف
application.ymlواحد - Hibernate يدير المخطط تلقائيًا
الخطوة التالية
الآن بعد أن تم تكوين PostgreSQL، دعونا ننتقل إلى الفصل 2 لفهم Jakarta مقابل Javax Persistence.