مروری بر migrationهای SQL
اگر با ایده SQL migrationها آشنا نیستید، در سطح خیلی کلی مفهومش اینطور کار میکند:
برای هر تغییری که میخواهید در database schema ایجاد کنید، مثل ساخت table، اضافه کردن column، یا حذف یک index استفادهنشده، یک جفت migration file میسازید. یک فایل migration «up» است که SQL statementهای لازم برای اعمال تغییر را در خودش دارد، و دیگری migration «down» است که SQL statementهای لازم برای برعکس کردن یا roll back کردن تغییر را شامل میشود.
هر جفت migration file به صورت sequential شمارهگذاری میشود، معمولا به شکل
0001, 0002, 0003...یا با یک Unix timestamp، تا ترتیب اعمال migrationها روی database مشخص شود.از نوعی ابزار یا script استفاده میکنید تا SQL statementهای داخل migration fileهای sequential را روی database اجرا یا roll back کند. این ابزار track میکند که کدام migrationها قبلا اعمال شدهاند، تا فقط SQL statementهای لازم واقعا اجرا شوند.
استفاده از migrationها برای مدیریت database schema، به جای اجرای دستی SQL statementها توسط خودتان، چند مزیت دارد:
database schema، همراه با evolution و تغییراتش، به طور کامل توسط migration fileهای SQL از نوع «up» و «down» توصیف میشود. و چون اینها فقط فایلهای معمولی شامل چند SQL statement هستند، میتوانند کنار بقیه کد شما در یک version control system قرار بگیرند و track شوند.
میتوان با اجرای migrationهای «up» لازم، database schema فعلی را به شکل دقیق روی ماشین دیگری replicate کرد. این وقتی بسیار کمککننده است که لازم دارید database schemaها را در environmentهای مختلف مثل development، testing و production مدیریت و synchronize کنید.
در صورت نیاز میتوان با اعمال migrationهای «down» مناسب، تغییرات database schema را roll back کرد.
نصب ابزار 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 اضافه کنید.
اما ما به دو دلیل این کار را نکردهایم:
در زمان نگارش، به دلیل اینکه command مربوط به
go toolفعلا از build tagها پشتیبانی نمیکند، عملا امکان اجرایmigrateبه عنوان tool dependency وجود ندارد. یک issue باز درباره این موضوع اینجا وجود دارد.codebase مربوط به
migrateتعداد بسیار زیادی child dependency دارد. اگر آن را به عنوان tool dependency بهgo.modاضافه کنید و همچنین بخواهید dependencyها را vendor کنید، کاری که بعدا در کتاب انجام میدهیم، repository شما حدود 280MB بزرگتر میشود.