# liquibase-go **Repository Path**: pteroant/liquigo ## Basic Information - **Project Name**: liquibase-go - **Description**: liquigo是一个参考了Liquibase中间件的golang开发的数据库版本管理工具,实现了大多数以xml格式配置的常用语法,并且适配了大多数常用的数据库系统,具体适配有:openGauss,TiDB,OceanBase.MySQL,MariaDB,PostgreSQL,KingbaseES,达梦,Oracle,MsSQLServer,SQLite。 - **Primary Language**: Go - **License**: BSD-2-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-09-09 - **Last Updated**: 2025-09-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # liquigo: Liquibase by golang liquigo是一个参考[Liquibase中间件](https://liquibase.org/)的golang开发的数据库版本管理工具,实现了大多数以xml格式配置的常用语法,支持的数据库类型和语法参见如下表格: |Liquibase语法(仅支持xml格式)|MySQL / TiDB / OceanBase|MariaDB|openGauss / PostgreSQL|KingbaseES|达梦|SQLite|Oracle|SQL Server| |-|-|-|-|-|-|-|-|-| |变更集:changeSet|√|√|√|√|√|√|√|√| |变更集注释:comment|√|√|√|√|√|√|√|√| |创建表:createTable|√|√|√|√|√|√|√|√| |删除表:dropTable|√|√|√|√|√|√|√|√| |重命名表:renameTable|√|√|√|√|√|-|√|√| |添加列:addColumn|√|√|√|√|√|-|√|√| |删除列:dropColumn|√|√|√|√|√|√|√|√| |重命名列:renameColumn|√|√|√|√|√|-|√|√| |变更列:modifyDataType|√|√|√|√|√|-|√|√| |删除默认值:dropDefaultValue|√|√|√|√|√|-|√|√| |创建视图:createView|√|√|√|√|√|√|√|√| |删除视图:dropView|√|√|√|√|√|√|√|√| |创建索引:createIndex|√|√|√|√|√|√|√|√| |删除索引:dropIndex|√|√|√|√|√|√|√|√| |属性替换${}|√|√|√|√|√|√|√|√| |执行SQL语句:sql|√|√|√|√|√|√|√|√| |执行SQL文件:sqlFile|√|√|√|√|√|√|√|√| |前置条件:preConditions|√|√|√|√|√|√|√|√| |前置条件与或非:not,and,or|√|√|√|√|√|√|√|√| |前置条件存在判断:tableExists,viewExists|√|√|√|√|√|√|√|√| |前置条件存在判断:columnExists,sqlCheck|√|√|√|√|√|√|√|√| |前置条件存在判断:indexExists|√|√|√|√|√|×|√|√| |事务回滚:rollback|√|√|√|√|√|√|√|√| |开发调试用停止:stop|√|√|√|√|√|√|√|√| 测试过的数据库系统版本有: openGauss V2.1.0 (兼容PostgreSQL模式) OceanBase V3.1.1 (兼容MySQL模式) MySQL V5.7.27 / MySQL V8.0.28 TiDB V5.4.0 MariaDB V10.3.34 PostgreSQL V12.10 KingbaseES V008R006 达梦 V8.1.2.2 SQLite V3.38 Oracle Express Edition V21c SQL Server V2019 具体使用请参考app.yml配置文件以及entry-\*.xml和db目录下的若干xml配置文件。 ---- # ChangeSet配置详解 ## 变更集:changeSet - 属性id: 必须全局唯一 - 属性author: 该changeSet的作者 - 属性failOnError: \[可选项\]运行出错时是否终止运行,默认为true - 属性runAlways: \[可选项\]该changeSet是否每次都运行,默认为false - 属性dbms: \[可选项\]该changeSet适用的数据库类型,默认为all,例如:mysql,dm,!sqlite 表示适用mysql和达梦,不适用sqlite - 属性ignore: \[可选项\]是否忽略该changeSet,默认为false,不忽略 - 元素comment: \[可选项\]该changeSet的注释说明,会记入db_change_set管理表的changeset_comment字段中 ``` xml comment of this changeSet ... ignore propertie for testing changeSet ... ``` ## 创建表:createTable ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql create table test_column_type ( type_boolean bit, type_bit6 bit, type_tinyint tinyint, type_smallint smallint, type_mediumint int, type_int int, type_integer integer, type_bigint bigint, type_float float, type_real real, type_double double, type_decimal decimal(15,3), type_numeric numeric(10,0), type_number number(10,0), type_char char(36), type_varchar varchar(36), type_binary binary(36), type_varbinary varbinary(36), type_tinyblob blob, type_blob blob, type_mediumblob blob, type_longblob blob, type_tinytext text, type_text text, type_mediumtext text, type_longtext text, type_datetime datetime, type_timestamp timestamp, type_date date, type_time time, type_uuid varchar(36), type_currency decimal(15,2) ); comment on table test_column_type is 'test the data type of the field'; create table test_role ( id varchar(36) not null, creator varchar(36) default '20000', created decimal(15) default 1, updater varchar(36) default '20000', updated decimal(15) default 1, uuid varchar(36) not null, role_name varchar(50) not null, detail varchar(250) not null default 'role', app_id varchar(36) default '3101', constraint pk_test_role_key primary key (id,uuid) ); comment on table test_role is 'test role'; create unique index uk_test_role_uuid on test_role (uuid); create unique index uk_test_role_name on test_role (role_name); comment on column test_role.role_name is 'role name'; comment on column test_role.detail is 'role detail'; comment on column test_role.app_id is 'foreign key sum_app.id'; ``` ## 删除表:dropTable ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql drop table test_t03 cascade constraints; ``` ## 重命名表:renameTable ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql alter table test_rename_table rename to test_rename_table_new; ``` ## 添加列:addColumn ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql alter table test_t04 add first_login_time varchar(30); comment on column test_t04.first_login_time is 'first login time, yyyy-MM-dd HH:mm:ss'; alter table test_t04 add login_count decimal(7) not null default 0; comment on column test_t04.login_count is 'login success count'; alter table test_t04 add login_account varchar(20) not null default 'default value'; comment on column test_t04.login_account is 'login account'; create unique index uk_user_login_account on test_t04 (login_account); ``` ## 删除列:dropColumn ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql alter table test_t04 drop column first_login_time cascade; alter table test_t04 drop column login_count cascade; alter table test_t04 drop column login_account cascade; ``` ## 重命名列:renameColumn ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql alter table test_t04 rename column app_id to new_app_id; comment on column test_t04.new_app_id is 'app id'; ``` ## 变更列:modifyDataType ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql alter table test_t04 modify new_app_id varchar(50); alter table test_t04 modify org_id varchar(70); ``` ## 删除默认值:dropDefaultValue ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql alter table test_role modify detail default null; ``` ## 创建视图:createView ``` xml select id, role_name, app_id from test_role where created >= 1644800296000; ``` 对应生成的适配达梦的sql脚本如下: ``` sql drop view if exists v_test_role; create or replace view v_test_role as select id, role_name, app_id from test_role where created >= 1644800296000; comment on view v_test_role is 'view of test role'; ``` ## 删除视图:dropView ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql drop view if exists v_test_role; ``` ## 创建索引:createIndex ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql create index idx_test_property_person_name on test_property_replace (person_name); create unique index idx_test_property_id_card on test_property_replace (id_card); ``` ## 删除索引:dropIndex ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql drop index uk_test_role_name; ``` ## 属性替换${} ``` xml ``` 对应生成的适配达梦的sql脚本如下: ``` sql create table test_property_replace ( id varchar(36) not null, creator varchar(36) default '20000', create_time decimal(15) default 1, person_name varchar(100), gender varchar(20), birthdate date, aaa_bbb_ccc varchar(50) default 'default ddd', person_status varchar(20), telephone varchar(150), email varchar(50), photo text, constraint pk_test_property_replace primary key (id) ); comment on table test_property_replace is 'test property replace'; comment on column test_property_replace.person_name is 'person name'; comment on column test_property_replace.gender is 'gender'; comment on column test_property_replace.birthdate is 'birth date'; comment on column test_property_replace.aaa_bbb_ccc is 'multi placer'; comment on column test_property_replace.person_status is 'person status'; comment on column test_property_replace.telephone is 'telephone'; comment on column test_property_replace.email is 'email'; comment on column test_property_replace.photo is 'photo'; ``` ## 执行SQL语句:sql ``` xml delete from test_role where created = 1644800296000; -- single line comment insert into test_role(id, creator, created, updater, updated, uuid, role_name, detail, app_id) values ('1', '1', 1644800296000, '1', 1644800296000, 'uuid1', 'role_name1', '1', '1'); insert into test_role(id, creator, created, updater, updated, uuid, role_name, detail, app_id) values ('2', '1', 1644800296000, '1', 1644800296000, 'uuid2', 'role_name2', '1', '1'); /* Multiline comment, append record */ insert into test_role(id, creator, created, updater, updated, uuid, role_name, detail, app_id) values ('3', '1', 1644800296000, '1', 1644800296000, 'uuid3', 'role_name3', '1', '1'); insert into test_role(id, creator, created, updater, updated, uuid, role_name, detail, app_id) values ('4', '4', 1644800296000, '4', 1644800296000, 'uuid4', 'role_name4', '1', '1'); ``` ## 执行SQL文件:sqlFile ``` xml ``` ## 前置条件:preConditions ``` xml ``` ## 前置条件与或非:not,and,or ``` xml ``` ## 前置条件存在判断:tableExists,viewExists,columnExists,indexExists,sqlCheck ``` xml select count(1) from test_role where id = '1' ``` ## 事务回滚:rollback ``` xml test preConditions and rollback drop table test_rollback ``` > 推荐一个完整的changeSet的结构,按顺序如下: > > 1. comment 提供注释说明,用于备忘 > > 2. preConditions 进行前置条件判断 > > 3. create/drop/add/.. 一个或多个数据库变更标签 > > 4. rollback 数据库变更失败后的回滚操作 ``` xml 注释说明,用于备忘 ``` ## 开发调试用停止:stop 当运行到包含stop标签的changeSet时停止(包含stop标签的changeSet不运行)。 ``` xml ... ... ``` ---- # 注意事项 ## 【禁止在sql标签中运行ddl语句】 ***所有的ddl变更必须使用对应的xml标签配置实现*** ``` xml create unique index idx_sys_dict_type on sys_dict_type(name); create index idx_itemcode_sys_dict_item on sys_dict_item(item_code); alter table sys_audit_log modify user_agent varchar(250); alter table svc_datax_task add target_name varchar(36); ```