مدیریت تغییرات دیتابیس با Liquibase

در پروسه توسعه نرم‌افزار یکی از سؤالاتی که همیشه پیش می‌آید که چگونه روند تکامل شمای دیتابیس و نسخه های مختلف را نگه داری کنیم و همچنین چگونه آنرا به نسخه نهایی مشتری منتقل کنیم.

ابزارهای مهاجرت دیتابیس (Database Migration Tools) مختلفی برای این موضوع وجود دارد. این ابزارها به شما کمک می‌کند که شمای دیتابیس را بسازید، آنرا در نسخه های مختلف اعمال کنید، و همچنین تست های خودکار بر اساس نسخه های مختلف کد و شمای DB بنویسید و مطمن باشید که تغییرات به درستی به محصول نهایی اعمال می گردد.

در دنیای جاوا دو ابزار بیشتر شناخته شده برای اینکار Flyway و Liquibase است.در ادامه ابزار Liquibase را بیشتر بررسی می کنیم.

با استفاده از Liquibase تغییرات مورد نظر را مستقل از نوع دیتابیس در فرمت XML,YML,JSON می‌توانید تعریف کنید و در نسخه های مختلف برنامه روی دیتابیس اعمال کنید. مستقل بودن از دیتابیس این امکان را دارد که مثلاً تست های اولیه را با H2 انجام دهید ولی در محصول نهایی از MySql استفاده کنید.

با استفاده از Flyway امکان تعریف تغییرات در فرمت SQL,Java وجود دارد. نوشتن تغییرات در فرمت SQL این امکان را می‌دهد که DBA مسؤل این تغییرات باشد و نیازی به یادگیری فرمت جدید نباشد و یا شروط پیچیده‌ای را با استفاده از فرمت جاوا برای تغییرات در نظر داشته باشید.

مفاهیم اولیه

  • فایل تغییرات: در این فایل کلیه تغییرات مورد نظر ذخیره می شود.

هر تغییر شامل یک شماره و نویسنده است و میتوان پیش شرط های را نیز برای آن‌ها در نظر گرفت.

برای تغییرات می‌توان context تعریف کرد که مثلاً این تغییر در زمان test اجرا شود و یا dev.( این context صرفاً یک کلمه تعریف شده توسط توسعه‌دهنده است)

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

<changeSet id="01" author="hhimanshu">
  <createTable tableName="books"
    remarks="A table to contain all books">
    <column name="id" type="int">
      <constraints nullable="false" unique="true" primaryKey="true"/>
    </column>
    <column name="name" type="varchar(255)">
      <constraints nullable="false" unique="true"/>
    </column>
    <column name="author" type="int">
      <constraints nullable="false"/>
    </column>
  </createTable>
</changeSet>
</databaseChangeLog>
  • فرمان ها: برای اعمال تغییرات بالا باید از دستور Update استفاده کنید. سایر دستوراتی که پشتیبانی می‌کند عبارتند از Update,Rollback,Diff,SQLOutput,DBDoc .
  • فایل تنظیمات: برای تعیین پارامترهای اتصال به دیتابیس و سایر تنظیمات می‌تواند آن‌ها در فایل liquibase.properties تعریف کنید. به عنوان مثال:
contexts: test 
changeLogFile: com/company/client/project/db.changelog.xml 
driver: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@tf-appserv-linux:1521:xe
username: admin
password: adminPass
verbose: true 
dropFirst: false 

برای استفاده از Liquibase میتوان آنرا به صورت مستقیم در خط فرمان فراخوانی کرد و یا از پلاگین های آن در Maven,Gradle,Ant,Sbt,Spring,… استفاده کنید.