مهاجرت های پایگاه داده: Flyway برای پروژه های Spring Boot

مانند Liquibase، Flyway را می توان به دو روش اصلی برای انتقال پایگاه داده در پروژه های Spring Boot استفاده کرد، چه در راه اندازی برنامه یا به صورت مستقل.
در این پست نحوه پیکربندی Flyway و استفاده از آن را در چارچوب پروژه Spring Boot برای هر دو مرحله توسعه و انتشار خواهیم دید، میتوانید نمونههایی را در مخزن موجود در: مخزن Github بیابید.
مفاهیم اساسی Flyway
اسکریپت مهاجرت و مهاجرت :
مهاجرت کوچکترین واحد تغییر قابل انتقال است که Flyway می تواند انجام دهد و در برابر پایگاه داده هدف ثبت کند و می تواند شامل یک یا چند عملیات واقع در فایلی به نام اسکریپت مهاجرت باشد.
یک مهاجرت در Flyway معادل یک تغییرات در Liquibase است، با این حال یک اسکریپت مهاجرت در Flyway برای میزبانی تنها یک مهاجرت در نظر گرفته شده است، و یک اسکریپت مهاجرت در Liquibase میتواند میزبان چندین تغییر باشد.
در Flyway اجرای یک مهاجرت معادل اجرای اسکریپت مهاجرت میزبان آن مهاجرت است.
جدول flyway_schema_history :
این جدولی است که Flyway روی یک پایگاه داده ایجاد می کند و از آن برای ردیابی مهاجرت هایی استفاده می کند که قبلاً در آن پایگاه داده هدف اجرا شده است، به طوری که همان مهاجرت را چندین بار اجرا نمی کند و از اینکه چه مهاجرت هایی باید در یک نقطه اجرا شود آگاه باشد. زمان (آنهایی که در جدول تاریخ ثبت نشده اند).
هر مهاجرت با مسیر فایل فایل مهاجرتی که در آن قرار دارد شناسایی می شود. هنگامی که Flyway یک مهاجرت را اجرا می کند، یک عدد چک جمع برای محتوای آن مهاجرت محاسبه می کند و آن را در جدول flyway_schema_history ذخیره می کند تا مطمئن شود که همان مهاجرت دوباره تغییر نخواهد کرد.
اگر Flyway متوجه شود که یک تغییرات پس از اعمال با مقایسه چکسامها اصلاح شده است، در طول فرآیند مهاجرت با خطا مواجه میشود.
پیکربندی مشترک
این شامل یک پوشه در فهرست منابع پروژه است، سپس آن را با فایل های مهاجرت پر کنید، در مثالی که نام آن را db/migrations گذاشته ام:
- V1_creating_persons_table.sql
- V2_inserting_rows_into_persons_table.sql
پیکربندی Flyway برای اجرای مهاجرت در هنگام راه اندازی برنامه
این نوع رفتار معمولاً در مرحله توسعه استفاده میشود، زمانی که یک توسعهدهنده باید وضعیت پایگاه دادهای را که در ماشین محلی خود دارد بهروزرسانی کند. Spring Boot برخی از تنظیمات خودکار را برای راه اندازی مهاجرت Flyway هنگام شروع برنامه ارائه می دهد.
برای اینکه پیکربندی خودکار آن کار کند، باید برخی اطلاعات را در فایل پیکربندی برنامه Spring Boot مربوط به محیط های محلی (application-local.yml) اضافه کنیم، مانند مکان پایگاه داده، نام کاربری و رمز عبور اتصال و مکان فایل های مهاجرت در مسیر کلاس برنامه:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/flyway_demo
username: postgres
password: changemeinproduction
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: none
flyway:
locations: classpath:db/migrations
سپس باید وابستگی flyway را در فایل pom.xml پروژه اضافه کنیم (اگر از Gradle استفاده می کنید فایل build.gradle):
org.flywaydb
flyway-core
اکنون هنگام راهاندازی برنامه Spring Boot متوجه وجود وابستگی Flyway به مسیر کلاس برنامه میشود و از اطلاعات موجود در تنظیمات fi,le برای راهاندازی پیکربندی خودکار که مسئول راهاندازی خودکار فرآیند مهاجرت بهصورت خودکار است، استفاده میکند. نمونهای از آنچه میتوانید هنگام شروع فرآیند مهاجرت در گزارشها ببینید:
2024-06-06T19:01:09.407+01:00 INFO 3229 --- [ main] org.flywaydb.core.FlywayExecutor : Database: jdbc:postgresql://localhost:5432/flyway_demo (PostgreSQL 16.0)
2024-06-06T19:01:09.428+01:00 WARN 3229 --- [ main] o.f.c.internal.database.base.Database : Flyway upgrade recommended: PostgreSQL 16.0 is newer than this version of Flyway and support has not been tested. The latest supported version of PostgreSQL is 15.
2024-06-06T19:01:09.450+01:00 INFO 3229 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Schema history table "public"."flyway_schema_history" does not exist yet
2024-06-06T19:01:09.453+01:00 INFO 3229 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.015s)
2024-06-06T19:01:09.486+01:00 INFO 3229 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table "public"."flyway_schema_history" ...
2024-06-06T19:01:09.538+01:00 INFO 3229 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "public": << Empty Schema >>
2024-06-06T19:01:09.547+01:00 INFO 3229 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "public" to version "1 - creating persons table"
2024-06-06T19:01:09.606+01:00 INFO 3229 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "public" to version "2 - inserting rows into persons table"
2024-06-06T19:01:09.647+01:00 INFO 3229 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 2 migrations to schema "public", now at version v2 (execution time 00:00.042s)
پیکربندی Flyway برای اجرای مهاجرت ها به طور مستقل از اجرای برنامه
این رفتار زمانی استفاده میشود که نسخه جدیدی از نرمافزار با استفاده از پایگاه داده آماده استقرار است و باید تعدادی مهاجرت در آن پایگاه داده اعمال شود.
Maven یک پلاگین برای اجرای مهاجرت های Flyway ارائه می دهد، این افزونه باید در مورد مکان پایگاه داده، نام کاربری و رمز عبور اتصال و مکان فایل های مهاجرت در پوشه پروژه اطلاعات داشته باشد، روشی که می توان آن را پیکربندی کرد با افزودن یک فایل در نامگذاری شده است. flyway.conf به پوشه منابع پروژه Spring Boot و سپس هنگام افزودن افزونه flyway maven با اشاره به مکان آن فایل در pom.xml:
flyway.user=postgres
flyway.password=changemeinproduction
flyway.schemas=demo_flyway
flyway.url=jdbc:postgresql://localhost:5432/demo_flyway
flyway.locations=src/main/resources/db/migrations
org.flywaydb
flyway-maven-plugin
6.5.7
src/main/resources/flyway.conf
اگر میخواهیم فرآیند مهاجرت را با استفاده از افزونه Flyway maven راهاندازی کنیم، باید ویژگی spring.flyway.enabled را روی false قرار دهیم تا زمانی که برنامه شروع میشود هیچ مهاجرتی اجرا نشود:
در نهایت باید مهاجرت ها را با استفاده از دستور زیر اجرا کنیم:
./mvnw flyway:migrate
و ما میتوانیم لاگهای زیر را ببینیم که نشان میدهد مهاجرتها با موفقیت انجام شده است.
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< ma.demo.flyway:flyway-demo >---------------------
[INFO] Building flyway-demo 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:6.5.7:migrate (default-cli) @ flyway-demo ---
[INFO] Flyway Community Edition 6.5.7 by Redgate
[INFO] Database: jdbc:postgresql://localhost:5432/flyway_demo (PostgreSQL 16.0)
[WARNING] Flyway upgrade recommended: PostgreSQL 16.0 is newer than this version of Flyway and support has not been tested. The latest supported version of PostgreSQL is 12.
[INFO] Creating schema "flyway_demo" ...
[INFO] Creating Schema History table "flyway_demo"."flyway_schema_history" ...
[INFO] Current version of schema "flyway_demo": null
[INFO] Migrating schema "flyway_demo" to version 1 - creating persons table
[INFO] Migrating schema "flyway_demo" to version 2 - inserting rows into persons table
[INFO] Successfully applied 2 migrations to schema "flyway_demo" (execution time 00:00.066s)
[WARNING] Flyway upgrade recommended: PostgreSQL 16.0 is newer than this version of Flyway and support has not been tested. The latest supported version of PostgreSQL is 12.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.797 s
[INFO] Finished at: 2024-06-06T19:04:59+01:00
[INFO] ------------------------------------------------------------------------
نتیجه
Flyway مهاجرت پایگاه داده را با اطمینان از اعمال مداوم تغییرات ساده میکند، در زمینه Spring Boot، میتوان آن را به راحتی برای راهاندازی فرآیند مهاجرت در هنگام راهاندازی برنامه ادغام کرد و این به توسعهدهنده کمک میکند تا تمرکز بیشتری روی ایجاد ویژگیهای جدید بدون نگرانی در مورد وضعیت داشته باشد. پایگاه های داده