توفر Ecto.Migration لغة نطاق (DSL) مستقلة عن نوع قاعدة البيانات لكتابة وتشغيل ترحيلات البيانات في تطبيقات Phoenix و Elixir.
أوامر سطر الأوامر للترحيل (CLI Migration Commands)
# توليد ملف ترحيل جديد
mix ecto.gen.migration add_status_to_orders
# تشغيل كافة الترحيلات المعلقة
mix ecto.migrate
# التراجع عن أحدث خطوة ترحيل
mix ecto.rollback
# فحص حالة الترحيلات
mix ecto.migrations
لغة تعريف الجداول (Table Definition DSL)
defmodule MyApp.Repo.Migrations.CreateDocuments do
use Ecto.Migration
def change do
create table(:documents) do
add :title, :string, size: 100, null: false
add :body, :text
add :price, :decimal, precision: 10, scale: 2
add :views, :integer, default: 0
add :active, :boolean, default: true, null: false
add :metadata, :map # JSON / JSONB
add :published_at, :utc_datetime
# مرجع المفتاح الخارجي
add :author_id, references(:users, on_delete: :delete_all), null: false
# إضافة حقلي inserted_at و updated_at
timestamps()
end
end
end
تعديل الجداول القائمة (alter)
alter table(:documents) do
add :subtitle, :string
modify :title, :string, size: 255
remove :views
end
الفهارس والقيود (Indices & Constraints)
# فهرس فريد لمنع التكرار
create unique_index(:users, [:email])
# فهرس مركب مع الإنشاء المتزامن (PostgreSQL)
create index(:orders, [:user_id, :status], concurrently: true)
# حذف الفهرس
drop index(:orders, [:status])
تنفيذ استعلامات SQL المباشرة (Raw SQL)
# تنفيذ أوامر SQL مخصصة داخل الترحيل
execute "CREATE EXTENSION IF NOT EXISTS citext;"