在代碼上我們有svn和git等諸多的版本控制方法。
但是在數據庫上卻沒有相應的工具。一度導致多環境見的數據庫同步難以維持。
flyway和liquibase都是常見的數據庫版本控制工具。
flyway社區版的功能相對完全免費的liquibase來說簡直毫無可比性。
因此免費用戶的話強烈liquibase。
樣例代碼已上傳至Github:https://github.com/hackyoMa/changedb,樣例基於Spring Boot。
flyway:
application.yml
spring: datasource: platform: mysql url: jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=utf8&useSSL=false username: xxx password: xxx driver-class-name: com.mysql.jdbc.Driver jpa: database: MYSQL show-sql: true hibernate: ddl-auto: none flyway: locations: classpath:db/migration
resources\db\migration\目錄下文件:
V1_0__createBook.sql
CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `create_time` datetime(0) NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; CREATE TRIGGER book_trigger AFTER INSERT ON book FOR EACH ROW BEGIN INSERT INTO test (`name`) VALUES ('1'); END;
V1_1__insertBook.sql
INSERT INTO book(name, create_time) VALUES ('測試', '2018-04-21 16:53:48');
liquibase:
application.yml
spring: datasource: platform: mysql url: jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=utf8&useSSL=false username: xxx password: xxx driver-class-name: com.mysql.jdbc.Driver jpa: database: MYSQL show-sql: true hibernate: ddl-auto: none liquibase: change-log: classpath:db/changelog/db.changelog-master.xml
resources\db\changelog\目錄下文件:
db.changelog-1.0.sql
--liquibase formatted sql --changeset mahaoyu:1.0 CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `create_time` datetime(0) NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; --changeset mahaoyu:1.1 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
db.changelog-1.1.sql
--liquibase formatted sql --changeset mahaoyu:1.2 splitStatements:false CREATE TRIGGER book_trigger AFTER INSERT ON book FOR EACH ROW BEGIN INSERT INTO test (`name`) VALUES ('1'); END; --changeset mahaoyu:1.3 splitStatements:false CREATE PROCEDURE `proc_adder` ( IN a INT, IN b INT, OUT sum INT ) BEGIN DECLARE c INT; IF a IS NULL THEN SET a = 0; END IF; IF b IS NULL THEN SET b = 0; END IF; SET sum = a + b; END; --changeset mahaoyu:1.4 CREATE VIEW Oceania AS SELECT * FROM book; --changeset mahaoyu:1.5 splitStatements:false CREATE FUNCTION hello ( ) RETURNS VARCHAR ( 255 ) BEGIN RETURN 'Hello world,i am mysql'; END; --changeset zhangsan:1.6 INSERT INTO book(name, create_time) VALUES ('測試', '2018-04-21 16:53:48');
db.changelog-master.xml
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <include file="db/changelog/db.changelog-1.0.sql"/> <include file="db/changelog/db.changelog-1.1.sql"/> </databaseChangeLog>
這里對liquibase的事務、觸發器等進行了示例。另外liquibase還支持xml語法,以增加對不同數據庫的支持。