Let's Go Further migrationهای SQL › مروری بر migrationهای SQL
قبلی · فهرست مطالب · بعدی
فصل ۶.۱.

مروری بر migrationهای SQL

اگر با ایده SQL migrationها آشنا نیستید، در سطح خیلی کلی مفهومش این‌طور کار می‌کند:

  1. برای هر تغییری که می‌خواهید در database schema ایجاد کنید، مثل ساخت table، اضافه کردن column، یا حذف یک index استفاده‌نشده، یک جفت migration file می‌سازید. یک فایل migration «up» است که SQL statementهای لازم برای اعمال تغییر را در خودش دارد، و دیگری migration «down» است که SQL statementهای لازم برای برعکس کردن یا roll back کردن تغییر را شامل می‌شود.

  2. هر جفت migration file به صورت sequential شماره‌گذاری می‌شود، معمولا به شکل 0001, 0002, 0003... یا با یک Unix timestamp، تا ترتیب اعمال migrationها روی database مشخص شود.

  3. از نوعی ابزار یا script استفاده می‌کنید تا SQL statementهای داخل migration fileهای sequential را روی database اجرا یا roll back کند. این ابزار track می‌کند که کدام migrationها قبلا اعمال شده‌اند، تا فقط SQL statementهای لازم واقعا اجرا شوند.

استفاده از migrationها برای مدیریت database schema، به جای اجرای دستی SQL statementها توسط خودتان، چند مزیت دارد:

نصب ابزار migrate

برای مدیریت SQL migrationها در این پروژه، از ابزار command-line مربوط به migrate استفاده می‌کنیم.

دستورالعمل‌های نصب دقیق برای operating systemهای مختلف را می‌توانید اینجا ببینید، اما روی macOS باید بتوانید با این command نصبش کنید:

$ brew install golang-migrate

و روی Linux و Windows، ساده‌ترین روش این است که یک pre-built binary دانلود کنید و آن را به جایی در system path خود منتقل کنید. برای مثال، روی Linux:

$ cd /tmp
$ curl -L https://github.com/golang-migrate/migrate/releases/download/v4.16.2/migrate.linux-amd64.tar.gz | tar xvz
$ mv migrate ~/go/bin/

قبل از ادامه، لطفا با اجرای binary مربوط به migrate همراه با flag مربوط به -version بررسی کنید که روی ماشین شما در دسترس است و کار می‌کند. باید شماره version فعلی را شبیه این خروجی دهد:

$ migrate -version
4.16.2

اطلاعات تکمیلی

اضافه کردن migrate به عنوان module tool dependency

خود ابزار migrate با Go نوشته شده است، یعنی در تئوری می‌توانید به جای نصب آن به عنوان binary مثل کاری که ما کردیم، از command مربوط به go get -tool استفاده کنید تا migrate را به عنوان یک tool dependency به فایل go.mod اضافه کنید.

اما ما به دو دلیل این کار را نکرده‌ایم:

  1. در زمان نگارش، به دلیل اینکه command مربوط به go tool فعلا از build tagها پشتیبانی نمی‌کند، عملا امکان اجرای migrate به عنوان tool dependency وجود ندارد. یک issue باز درباره این موضوع اینجا وجود دارد.

  2. codebase مربوط به migrate تعداد بسیار زیادی child dependency دارد. اگر آن را به عنوان tool dependency به go.mod اضافه کنید و همچنین بخواهید dependencyها را vendor کنید، کاری که بعدا در کتاب انجام می‌دهیم، repository شما حدود 280MB بزرگ‌تر می‌شود.