Dbmate هي أداة لترحيل قاعدة البيانات من شأنها أن تحافظ على مزامنة مخطط قاعدة البيانات الخاصة بك عبر العديد من المطورين وخوادم الإنتاج الخاصة بك.
إنها أداة سطر أوامر مستقلة يمكن استخدامها مع Go أو Node.js أو Python أو Ruby أو PHP أو Rust أو C++ أو أي لغة أو إطار عمل آخر تستخدمه لكتابة التطبيقات المدعومة بقاعدة البيانات. يعد هذا مفيدًا بشكل خاص إذا كنت تكتب خدمات متعددة بلغات مختلفة، وترغب في الحفاظ على بعض السلامة باستخدام أدوات التطوير المتسقة.
لإجراء مقارنة بين dbmate وأدوات ترحيل مخطط قاعدة البيانات الشائعة الأخرى، يرجى الاطلاع على البدائل.
schema.sql
لتمييز تغييرات المخطط بسهولة في gitDATABASE_URL
بشكل افتراضي)، أو يتم تحديده في سطر الأوامر.env
الخاص بكالآلية الوقائية الوطنية
التثبيت باستخدام NPM:
npm install --save-dev dbmate
npx dbmate --help
ماك
التثبيت باستخدام Homebrew:
brew install dbmate
dbmate --help
لينكس
تثبيت الثنائي مباشرة:
sudo curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
sudo chmod +x /usr/local/bin/dbmate
/usr/local/bin/dbmate --help
ويندوز
التثبيت باستخدام سكوب
scoop install dbmate
dbmate -- help
عامل ميناء
يتم نشر صور Docker في GitHub Container Registry ( ghcr.io/amacneil/dbmate
).
تذكر تعيين --network=host
أو راجع هذا التعليق للحصول على مزيد من النصائح حول استخدام dbmate مع شبكة عامل الإرساء):
docker run --rm -it --network=host ghcr.io/amacneil/dbmate --help
إذا كنت ترغب في إنشاء عمليات ترحيل أو تطبيقها، فستحتاج إلى استخدام ميزة Docker's bind mount لجعل دليل العمل المحلي ( pwd
) متاحًا داخل حاوية dbmate:
docker run --rm -it --network=host -v " $( pwd ) /db:/db " ghcr.io/amacneil/dbmate new create_users_table
dbmate --help # print usage help
dbmate new # generate a new migration file
dbmate up # create the database (if it does not already exist) and run any pending migrations
dbmate create # create the database
dbmate drop # drop the database
dbmate migrate # run any pending migrations
dbmate rollback # roll back the most recent migration
dbmate down # alias for rollback
dbmate status # show the status of all migrations (supports --exit-code and --quiet)
dbmate dump # write the database schema.sql file
dbmate load # load schema.sql file to the database
dbmate wait # wait for the database server to become available
الخيارات التالية متاحة مع كافة الأوامر. يجب عليك استخدام وسيطات سطر الأوامر بالترتيب dbmate [global options] command [command options]
. يمكن أيضًا تكوين معظم الخيارات عبر متغيرات البيئة (وتحميلها من ملف .env
الخاص بك، وهو أمر مفيد لمشاركة التكوين بين أعضاء الفريق).
--url, -u "protocol://host:port/dbname"
- حدد عنوان URL لقاعدة البيانات مباشرةً. (البيئة: DATABASE_URL
)--env, -e "DATABASE_URL"
- حدد متغير بيئة لقراءة عنوان URL لاتصال قاعدة البيانات منه.--env-file ".env"
- حدد ملف (ملفات) متغيرات البيئة البديلة لتحميلها.--migrations-dir, -d "./db/migrations"
- مكان حفظ ملفات الترحيل. (البيئة: DBMATE_MIGRATIONS_DIR
)--migrations-table "schema_migrations"
- جدول قاعدة البيانات لتسجيل عمليات الترحيل فيه. (env: DBMATE_MIGRATIONS_TABLE
)--schema-file, -s "./db/schema.sql"
- مسار للاحتفاظ بملف schema.sql. (البيئة: DBMATE_SCHEMA_FILE
)--no-dump-schema
- لا تقم بتحديث ملف schema.sql تلقائيًا عند الترحيل/التراجع (env: DBMATE_NO_DUMP_SCHEMA
)--strict
- فشل إذا تم تطبيق عمليات الترحيل خارج الترتيب (env: DBMATE_STRICT
)--wait
- انتظر حتى تصبح قاعدة البيانات متاحة قبل تنفيذ الأمر اللاحق (env: DBMATE_WAIT
)--wait-timeout 60s
- مهلة علامة - الانتظار (env: DBMATE_WAIT_TIMEOUT
) يقوم Dbmate بتحديد موقع قاعدة البيانات الخاصة بك باستخدام متغير البيئة DATABASE_URL
بشكل افتراضي. إذا كنت تكتب تطبيقًا مكونًا من اثني عشر عاملًا، فيجب عليك تخزين جميع سلاسل الاتصال في متغيرات البيئة.
لتسهيل ذلك في التطوير، يبحث dbmate عن ملف .env
في الدليل الحالي، ويتعامل مع أي متغيرات مدرجة هناك كما لو كانت محددة في البيئة الحالية (ومع ذلك، فإن متغيرات البيئة الموجودة لها الأفضلية).
إذا لم يكن لديك ملف .env
بالفعل، فقم بإنشاء ملف وأضف عنوان URL لاتصال قاعدة البيانات الخاصة بك:
$ cat .env
DATABASE_URL= " postgres://[email protected]:5432/myapp_development?sslmode=disable "
يجب تحديد DATABASE_URL
بالتنسيق التالي:
protocol://username:password@host:port/database_name?options
protocol
واحدًا من mysql
، postgres
، و postgresql
، و sqlite
، و sqlite3
، و clickhouse
username
password
مشفرين عبر عنوان URL (سوف تحصل على خطأ إذا استخدمت أحرفًا خاصة)host
إما اسم مضيف أو عنوان IPoptions
خاصة ببرنامج التشغيل (راجع برامج تشغيل Go SQL الأساسية إذا كنت ترغب في استخدامها) يمكن لـ Dbmate أيضًا تحميل عنوان URL للاتصال من متغير بيئة مختلف. على سبيل المثال، قبل تشغيل مجموعة الاختبار الخاصة بك، قد ترغب في إسقاط قاعدة بيانات الاختبار وإعادة إنشائها. إحدى الطرق السهلة للقيام بذلك هي تخزين عنوان URL لاتصال قاعدة بيانات الاختبار في متغير البيئة TEST_DATABASE_URL
:
$ cat .env
DATABASE_URL= " postgres://[email protected]:5432/myapp_dev?sslmode=disable "
TEST_DATABASE_URL= " postgres://[email protected]:5432/myapp_test?sslmode=disable "
يمكنك بعد ذلك تحديد متغير البيئة هذا في البرنامج النصي للاختبار (Makefile أو ما شابه):
$ dbmate -e TEST_DATABASE_URL drop
Dropping: myapp_test
$ dbmate -e TEST_DATABASE_URL --no-dump-schema up
Creating: myapp_test
Applying: 20151127184807_create_users_table.sql
Applied: 20151127184807_create_users_table.sql in 123µs
وبدلاً من ذلك، يمكنك تحديد عنوان URL مباشرة في سطر الأوامر:
$ dbmate -u " postgres://[email protected]:5432/myapp_test?sslmode=disable " up
الميزة الوحيدة لاستخدام dbmate -e TEST_DATABASE_URL
عبر dbmate -u $TEST_DATABASE_URL
هي أن الأول يستفيد من التحميل التلقائي لملف .env
الخاص بـ dbmate.
عند الاتصال بـ Postgres، قد تحتاج إلى إضافة خيار sslmode=disable
إلى سلسلة الاتصال الخاصة بك، حيث يتطلب dbmate بشكل افتراضي اتصال TLS (تسمح بعض الأطر/اللغات الأخرى باتصالات غير مشفرة بشكل افتراضي).
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?sslmode=disable "
يمكن تحديد socket
أو معلمة host
للاتصال عبر مقبس يونكس (ملاحظة: حدد الدليل فقط):
DATABASE_URL= " postgres://username:password@/database_name?socket=/var/run/postgresql "
يمكن استخدام معلمة search_path
لتحديد المخطط الحالي أثناء تطبيق عمليات الترحيل، بالإضافة إلى جدول schema_migrations
الخاص بـ dbmate. إذا كان المخطط غير موجود، فسيتم إنشاؤه تلقائيًا. إذا تم تمرير عدة مخططات مفصولة بفواصل، فسيتم استخدام الأول لجدول schema_migrations
.
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?search_path=myschema "
DATABASE_URL= " postgres://username:[email protected]:5432/database_name?search_path=myschema,public "
DATABASE_URL= " mysql://username:[email protected]:3306/database_name "
يمكن تحديد معلمة socket
للاتصال عبر مأخذ توصيل يونكس:
DATABASE_URL= " mysql://username:password@/database_name?socket=/var/run/mysqld/mysqld.sock "
يتم تخزين قواعد بيانات SQLite في نظام الملفات، لذلك لا تحتاج إلى تحديد مضيف. بشكل افتراضي، تكون الملفات مرتبطة بالدليل الحالي. على سبيل المثال، سيقوم ما يلي بإنشاء قاعدة بيانات على ./db/database.sqlite3
:
DATABASE_URL= " sqlite:db/database.sqlite3 "
لتحديد مسار مطلق، أضف شرطة مائلة للأمام إلى المسار. سيقوم ما يلي بإنشاء قاعدة بيانات على /tmp/database.sqlite3
:
DATABASE_URL= " sqlite:/tmp/database.sqlite3 "
DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name "
للعمل مع مجموعة ClickHouse، هناك 4 معلمات استعلام اتصال يمكن توفيرها:
on_cluster
- إشارة لاستخدام بيانات المجموعة وجدول الترحيل المنسوخ. (افتراضي: false
) إذا لم يتم توفير هذه المعلمة، فسيتم تجاهل معلمات الاستعلام الأخرى ذات الصلة بالمجموعة. DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster "
DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster=true "
cluster_macro
(اختياري) - قيمة الماكرو التي سيتم استخدامها لعبارات ON CLUSTER ولمسار حارس حديقة الحيوان لمحرك جدول الترحيل الذي تم استبداله. (الافتراضي: {cluster}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&cluster_macro={my_cluster} "
replica_macro
(اختياري) - قيمة الماكرو التي سيتم استخدامها لاسم النسخة المتماثلة في محرك جدول الترحيل الذي تم استبداله. (الافتراضي: {replica}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&replica_macro={my_replica} "
zoo_path
(اختياري) - المسار إلى ترحيل الجدول في ClickHouse/Zoo Keeper. (الافتراضي: /clickhouse/tables/<cluster_macro>/{table}
) DATABASE_URL= " clickhouse://username:[email protected]:9000/database_name?on_cluster&zoo_path=/zk/path/tables "
انظر خيارات الاتصال المدعومة الأخرى.
اتبع التنسيق التالي لـ DATABASE_URL
عند الاتصال بـ BigQuery الفعلي في GCP:
bigquery://projectid/location/dataset
projectid
(إلزامي) - معرف المشروع
dataset
(إلزامية) - اسم مجموعة البيانات داخل المشروع
location
(اختياري) - مكان إنشاء مجموعة البيانات
ملاحظة: اتبع هذا المستند حول كيفية تعيين متغير البيئة GOOGLE_APPLICATION_CREDENTIALS
للمصادقة المناسبة
اتبع التنسيق التالي إذا كنت تحاول الاتصال بنقطة نهاية مخصصة، على سبيل المثال BigQuery Emulator
bigquery://host:port/projectid/location/dataset?disable_auth=true
disable_auth
(اختياري) - قم بتمرير true
لتخطي المصادقة، واستخدمه فقط للاختبار والاتصال بالمحاكي.
يقتصر دعم Spanner حاليًا على قواعد البيانات التي تستخدم لهجة PostgreSQL، والتي يجب اختيارها أثناء إنشاء قاعدة البيانات. للحصول على دعم Spanner المستقبلي لـ GoogleSQL، راجع هذه المناقشة.
يتطلب مفتاح البراغي المزود بواجهة Postgres تشغيل PGAdapter. استخدم التنسيق التالي لـ DATABASE_URL
، مع ضبط المضيف والمنفذ على مكان تشغيل PGAdapter:
DATABASE_URL= " spanner-postgres://127.0.0.1:5432/database_name?sslmode=disable "
لاحظ أن تحديد اسم مستخدم وكلمة مرور ليس ضروريًا، حيث تتم معالجة المصادقة بواسطة PGAdapter (سيتم تجاهلهما بواسطة PGAdapter إذا تم تحديدهما).
يتم دعم الخيارات الأخرى لبرنامج تشغيل postgres.
لا يسمح Spanner أيضًا بتنفيذ DDL داخل المعاملات الصريحة. لذلك يجب عليك تحديد transaction:false
في عمليات الترحيل التي تتضمن DDL:
-- migrate:up transaction:false
CREATE TABLE ...
-- migrate:down transaction:false
DROP TABLE ...
عمليات تفريغ المخطط غير مدعومة حاليًا، حيث يستخدم pg_dump
وظائف لا يوفرها Spanner.
لإنشاء عملية ترحيل جديدة، قم بتشغيل dbmate new create_users_table
. يمكنك تسمية الهجرة بأي شيء تريده. سيؤدي هذا إلى إنشاء ملف db/migrations/20151127184807_create_users_table.sql
في الدليل الحالي:
-- migrate:up
-- migrate:down
لكتابة عملية ترحيل، ما عليك سوى إضافة SQL إلى قسم migrate:up
:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
email varchar ( 255 ) not null
);
-- migrate:down
ملاحظة: يتم تسمية ملفات الترحيل بالتنسيق
[version]_[description].sql
. يتم تسجيل الإصدار فقط (المحدد على أنه جميع الأحرف الرقمية البادئة في اسم الملف) في قاعدة البيانات، لذا يمكنك إعادة تسمية ملف الترحيل بأمان دون التأثير على حالة التطبيق الحالية.
قم بتشغيل dbmate up
لتشغيل أي عمليات ترحيل معلقة.
$ dbmate up
Creating: myapp_development
Applying: 20151127184807_create_users_table.sql
Applied: 20151127184807_create_users_table.sql in 123µs
Writing: ./db/schema.sql
ملاحظة: سيقوم
dbmate up
بإنشاء قاعدة البيانات إذا لم تكن موجودة بالفعل (بافتراض أن المستخدم الحالي لديه الإذن بإنشاء قواعد البيانات). إذا كنت تريد تشغيل عمليات الترحيل دون إنشاء قاعدة البيانات، فقم بتشغيلdbmate migrate
.
يتم دائمًا تطبيق عمليات الترحيل المعلقة بترتيب رقمي. ومع ذلك، لا يمنع dbmate تطبيق عمليات الترحيل خارج الترتيب إذا تم تنفيذها بشكل مستقل (على سبيل المثال: إذا كان المطور يعمل على فرع لفترة طويلة، ويقوم بتنفيذ عملية ترحيل لها رقم إصدار أقل من الإصدارات الأخرى بالفعل- عمليات الترحيل المطبقة، سيقوم dbmate ببساطة بتطبيق عملية الترحيل المعلقة). انظر رقم 159 لمزيد من الشرح التفصيلي.
افتراضيًا، لا يعرف dbmate كيفية استرجاع عملية الترحيل. في مرحلة التطوير، غالبًا ما يكون من المفيد أن تكون قادرًا على إعادة قاعدة بياناتك إلى حالتها السابقة. لتحقيق ذلك، قم بتنفيذ قسم migrate:down
:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
email varchar ( 255 ) not null
);
-- migrate:down
drop table users;
قم بتشغيل dbmate rollback
لاسترجاع آخر عملية ترحيل:
$ dbmate rollback
Rolling back: 20151127184807_create_users_table.sql
Rolled back: 20151127184807_create_users_table.sql in 123µs
Writing: ./db/schema.sql
يدعم dbmate الخيارات التي تم تمريرها إلى كتلة الترحيل في شكل أزواج من key:value
. قائمة الخيارات المدعومة:
transaction
عملية
تكون transaction
مفيدة إذا كنت لا ترغب في تشغيل SQL داخل المعاملة:
-- migrate:up transaction:false
ALTER TYPE colors ADD VALUE ' orange ' AFTER ' red ' ;
ستكون transaction
الافتراضية true
إذا كانت قاعدة البيانات الخاصة بك تدعمها.
إذا كنت تستخدم بيئة تطوير Docker لمشروعك، فقد تواجه مشكلات مع عدم جاهزية قاعدة البيانات على الفور عند تشغيل عمليات الترحيل أو اختبارات الوحدة. يمكن أن يكون هذا بسبب أن خادم قاعدة البيانات قد بدأ للتو.
بشكل عام، يجب أن يكون تطبيقك مرنًا لعدم وجود اتصال بقاعدة بيانات فعالة عند بدء التشغيل. ومع ذلك، لغرض تشغيل عمليات الترحيل أو اختبارات الوحدة، فإن هذا غير عملي. يتجنب أمر wait
هذا الموقف من خلال السماح لك بإيقاف البرنامج النصي أو أي تطبيق آخر مؤقتًا حتى تصبح قاعدة البيانات متاحة. سيحاول Dbmate الاتصال بخادم قاعدة البيانات كل ثانية، بحد أقصى 60 ثانية.
إذا كانت قاعدة البيانات متاحة، فلن يُرجع wait
أي مخرجات:
$ dbmate wait
إذا كانت قاعدة البيانات غير متوفرة، فسيتم حظر wait
حتى تصبح قاعدة البيانات متاحة:
$ dbmate wait
Waiting for database....
يمكنك أيضًا استخدام علامة --wait
مع أوامر أخرى إذا رأيت أحيانًا حالات فشل ناتجة عن عدم جاهزية قاعدة البيانات بعد:
$ dbmate --wait up
Waiting for database....
Creating: myapp_development
يمكنك تخصيص المهلة باستخدام --wait-timeout
(الافتراضي 60 ثانية). إذا كانت قاعدة البيانات لا تزال غير متوفرة، فسيقوم الأمر بإرجاع خطأ:
$ dbmate --wait-timeout=5s wait
Waiting for database.....
Error: unable to connect to database: dial tcp 127.0.0.1:5432: connect: connection refused
يرجى ملاحظة أن أمر wait
لا يتحقق من وجود قاعدة البيانات المحددة، بل يتحقق فقط من أن الخادم متاح وجاهز (وبالتالي سيعيد النجاح إذا كان خادم قاعدة البيانات متاحًا، ولكن لم يتم إنشاء قاعدة البيانات الخاصة بك بعد).
عند تشغيل الأوامر up
أو migrate
أو rollback
، سيقوم dbmate تلقائيًا بإنشاء ملف ./db/schema.sql
يحتوي على تمثيل كامل لمخطط قاعدة البيانات الخاصة بك. يقوم Dbmate بإبقاء هذا الملف محدثًا لك، لذا لا ينبغي عليك تحريره يدويًا.
يوصى بفحص هذا الملف في التحكم بالمصادر، بحيث يمكنك بسهولة مراجعة التغييرات التي تم إجراؤها على المخطط في عمليات الالتزام أو طلبات السحب. من الممكن أيضًا استخدام هذا الملف عندما تريد تحميل مخطط قاعدة البيانات بسرعة، دون تشغيل كل عملية ترحيل بشكل تسلسلي (على سبيل المثال في أداة الاختبار الخاصة بك). ومع ذلك، إذا كنت لا ترغب في حفظ هذا الملف، فيمكنك إضافته إلى .gitignore
أو تمرير خيار سطر الأوامر --no-dump-schema
.
لتفريغ ملف schema.sql
دون تنفيذ أي إجراءات أخرى، قم بتشغيل dbmate dump
. على عكس إجراءات dbmate الأخرى، يعتمد هذا الأمر على أوامر pg_dump
أو mysqldump
أو sqlite3
المتوفرة في PATH الخاص بك. إذا لم تكن هذه الأدوات متوفرة، فسيقوم dbmate بتخطي خطوة تفريغ المخطط بصمت أثناء إجراءات up
أو migrate
أو rollback
. يمكنك تشخيص المشكلة عن طريق تشغيل dbmate dump
والنظر إلى الإخراج:
$ dbmate dump
exec: " pg_dump " : executable file not found in $PATH
في أنظمة Ubuntu أو Debian، يمكنك إصلاح ذلك عن طريق تثبيت postgresql-client
أو mysql-client
أو sqlite3
على التوالي. تأكد من أن إصدار الحزمة الذي تقوم بتثبيته أكبر من أو يساوي الإصدار الذي يعمل على خادم قاعدة البيانات الخاصة بك.
ملاحظة: سيحتوي ملف
schema.sql
على مخطط كامل لقاعدة البيانات الخاصة بك، حتى إذا تم إنشاء بعض الجداول أو الأعمدة خارج عمليات ترحيل dbmate.
تم تصميم Dbmate لاستخدامه كواجهة سطر أوامر (CLI) مع أي لغة أو إطار عمل، ولكن يمكن استخدامه أيضًا كمكتبة في تطبيق Go.
هنا مثال بسيط. تذكر استيراد برنامج التشغيل الذي تحتاجه!
package main
import (
"net/url"
"github.com/amacneil/dbmate/v2/pkg/dbmate"
_ "github.com/amacneil/dbmate/v2/pkg/driver/sqlite"
)
func main () {
u , _ := url . Parse ( "sqlite:foo.sqlite3" )
db := dbmate . New ( u )
err := db . CreateAndMigrate ()
if err != nil {
panic ( err )
}
}
راجع الوثائق المرجعية لمزيد من الخيارات.
يمكن تضمين عمليات الترحيل في التطبيق الثنائي الخاص بك باستخدام وظيفة التضمين الخاصة بـ Go.
استخدم db.FS
لتحديد نظام الملفات المستخدم لقراءة عمليات الترحيل:
package main
import (
"embed"
"fmt"
"net/url"
"github.com/amacneil/dbmate/v2/pkg/dbmate"
_ "github.com/amacneil/dbmate/v2/pkg/driver/sqlite"
)
//go:embed db/migrations/*.sql
var fs embed. FS
func main () {
u , _ := url . Parse ( "sqlite:foo.sqlite3" )
db := dbmate . New ( u )
db . FS = fs
fmt . Println ( "Migrations:" )
migrations , err := db . FindMigrations ()
if err != nil {
panic ( err )
}
for _ , m := range migrations {
fmt . Println ( m . Version , m . FilePath )
}
fmt . Println ( " n Applying..." )
err = db . CreateAndMigrate ()
if err != nil {
panic ( err )
}
}
ملفات الترحيل بسيطة جدًا، ويتم تخزينها في ./db/migrations
افتراضيًا. يمكنك إنشاء ملف ترحيل جديد باسم [date]_create_users.sql
عن طريق تشغيل dbmate new create_users
. هنا مثال:
-- migrate:up
create table users (
id integer ,
name varchar ( 255 ),
);
-- migrate:down
drop table if exists users;
يتم تخزين كل من عمليات الترحيل لأعلى ولأسفل في نفس الملف، لسهولة التحرير. كلا التوجيهين لأعلى ولأسفل مطلوبان، حتى إذا اخترت عدم تنفيذ الترحيل لأسفل.
عند تطبيق عملية ترحيل، يقوم dbmate بتخزين رقم الإصدار فقط، وليس المحتويات، لذلك يجب عليك دائمًا التراجع عن عملية الترحيل قبل تعديل محتوياتها. لهذا السبب، يمكنك إعادة تسمية ملف الترحيل بأمان دون التأثير على حالته المطبقة، طالما أنك تحافظ على رقم الإصدار سليمًا.
تتم كتابة ملف المخطط إلى ./db/schema.sql
بشكل افتراضي. إنه تفريغ كامل لمخطط قاعدة البيانات الخاصة بك، بما في ذلك أي عمليات ترحيل مطبقة وأي تعديلات أخرى قمت بإجرائها.
يجب إيداع هذا الملف في التحكم بالمصادر، بحيث يمكنك بسهولة مقارنة اختلافات الترحيل. يمكنك استخدام ملف المخطط لاستعادة قاعدة البيانات الخاصة بك بسرعة دون الحاجة إلى تشغيل كافة عمليات الترحيل.
يقوم Dbmate بتخزين سجل لكل عملية ترحيل مطبقة في جدول يسمى schema_migrations
. سيتم إنشاء هذا الجدول لك تلقائيًا إذا لم يكن موجودًا بالفعل.
الجدول بسيط جداً:
CREATE TABLE IF NOT EXISTS schema_migrations (
version VARCHAR ( 255 ) PRIMARY KEY
)
يمكنك تخصيص اسم هذا الجدول باستخدام علامة --migrations-table
أو متغير البيئة DBMATE_MIGRATIONS_TABLE
.
لماذا أداة أخرى لترحيل مخطط قاعدة البيانات؟ تم استلهام Dbmate من العديد من الأدوات الأخرى، في المقام الأول Active Record Migrations، بهدف أن يكون تافهًا في التكوين، وأن يكون مستقلاً عن اللغة وإطار العمل. فيما يلي مقارنة بين dbmate وأدوات الترحيل الشائعة الأخرى.
com.dbmate | أوزة | sql-migrate | جولانج-هجرة | activerecord | تكملة | مسار الطيران | سكيتش | |
---|---|---|---|---|---|---|---|---|
سمات | ||||||||
ملفات ترحيل SQL عادية | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ||
دعم لإنشاء وإسقاط قواعد البيانات | ✅ | ✅ | ||||||
دعم لحفظ ملفات تفريغ المخطط | ✅ | ✅ | ||||||
ملفات الترحيل ذات إصدار الطابع الزمني | ✅ | ✅ | ✅ | ✅ | ✅ | |||
جدول ترحيل المخطط المخصص | ✅ | ✅ | ✅ | ✅ | ||||
القدرة على الانتظار حتى تصبح قاعدة البيانات جاهزة | ✅ | |||||||
سلسلة اتصال قاعدة البيانات المحملة من متغيرات البيئة | ✅ | ✅ | ||||||
تحميل ملف .env تلقائيًا | ✅ | |||||||
لا يوجد ملف تكوين منفصل | ✅ | ✅ | ✅ | ✅ | ✅ | |||
اللغة/الإطار مستقل | ✅ | ✅ | ✅ | ✅ | ✅ | |||
السائقين | ||||||||
PostgreSQL | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
ماي إس كيو إل | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
سكليتي | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
ClickHouse | ✅ | ✅ | ✅ | ✅ |
إذا لاحظت أي أخطاء في هذا الجدول، يرجى اقتراح التغيير.
تمت كتابة Dbmate بلغة Go، ونرحب بطلبات السحب.
يتم إجراء الاختبارات على قاعدة بيانات حقيقية باستخدام docker compose. لإنشاء صورة عامل إرساء وإجراء الاختبارات:
$ make docker-all
لبدء قذيفة التطوير:
$ make docker-sh