使用 liquibase 發展資料庫結構
TRANSCRIPT
使用 Liquibase 發展資料庫結構Liquibase is 10 years old!!
Ref: Datical DB
• 高控制性• 無法自動判斷變更的版本• 需要依賴人工介入• 很難處理不同版本的資料庫轉移
• 與程式碼的耦合度高• 可以透過不同的 dialect 處理不同的資料庫• 只能有條件的管理變更• 很難處理資料的變更
SQL JPA
最初的需求 (2006)• 所有的變更都和程式碼一起保存在版本控制系統裡,並且可以被分支與合併• 每一個變更都可以容易的被產生,並且擁有獨一無二的識別• 每個資料庫知道要執行哪些變更來符合現在程式碼的版本
Ref: Sundog Database Refactoring Tool Early Access Program Opens
最初的需求 (2016)• 支援多種資料庫,甚至能在不同的資料庫執行相同的程式• 支援多個開發人員、多個分支下的並行開發• 安全的更新資料庫結構而不必擔心資料遺失• 追蹤資料庫的變化
Ref: Happy Birthday! Here's to 10 Years of Liquibase
支援• Java 1.4 和 1.5
• MySQL, PostgreSQL, Oracle, Sql Server, Sybase, DB2, Derby, HSQL, H2, Informix, Firebird, SQLite
• Command Line, Ant, Maven, Gradle, Spring-boot…
• XML, YAML, JSON, SQL
Ref: Datical DB
ChangeLog
ChangeSet
Change
1
*
1
*
必須能自動執行
版本控制
結構
<databaseChangeLog xmlns=“…”>
<changeSet id="00000000000001" author=“steven">
<createTable tableName="user"> <column name="id" type="bigint" autoIncrement="true"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(100)"/> </createTable>
<rollback> drop table user </rollback>
</changeSet>
</databaseChangeLog>
兩個重要的 table• DATABASECHANGELOG
• 用來追蹤哪些 ChangeSet 已經執行• Author 、 ID 、 File
• DATABASECHANGELOGLOCK
• 避免衝突
常用的指令• update
• rollback
• diff
• tag
Ref: Liquibase Command Line
Best Practices
• 透過 master.xml 來管理所有的 ChangeSet
• 不更改已執行過的 ChangeSet
• 確保所有的 ChangeSet 都有 Rollback
Ref: Liquibase Best Practices
常見的問題• ChangeSet 的主要屬性: runAlways,
runOnChange, runInTransaction 的使用• rollback 的問題• generateChangeLog 指令
練習資源• Tutorial using Oracle
• http://www.liquibase.org/tutorial-using-oracle
• JCConf TW 2015 Database Continuous Integration
• https://github.com/wang-steven/jcconf-tw-2015