Skip to content

Latest commit

 

History

History
123 lines (110 loc) · 5.99 KB

README.md

File metadata and controls

123 lines (110 loc) · 5.99 KB

This module is used for create upgrade.sql and revert.sql when db is change;

use antlr4 to parse sql to ParseTree and rebuild;

execute command below

java -jar diff-antlr4-1.0-SNAPSHOT-jar-with-dependencies.jar origin.sql target.sql

then create upgrade.sql and revert.sql

for example:

origin.sql is as below:

CREATE DATABASE IF NOT EXISTS test;
USE test;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`
(
    `id`           int(11)      NOT NULL AUTO_INCREMENT,
    `name`         varchar(256) NOT NULL COMMENT 'account name',
    `password`     varchar(64)  NOT NULL COMMENT 'password md5',
    `account_type` int(11)      NOT NULL DEFAULT '1' COMMENT 'account type, 0-manager 1-normal',
    `due_date`     datetime              DEFAULT NULL COMMENT 'due date for account',
    `create_time`  datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time',
    `update_time`  datetime              DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'update time',
    `create_by`    varchar(256) NOT NULL COMMENT 'create by sb.',
    `update_by`    varchar(256)          DEFAULT NULL COMMENT 'update by sb.',
    PRIMARY KEY (`id`),
    UNIQUE KEY `unique_user_name_idx` (`name`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='User table';

target.sql as below:

CREATE DATABASE IF NOT EXISTS test;
USE test;


CREATE TABLE IF NOT EXISTS `user`
(
    `id`              int(11)      NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key',
    `name`            varchar(256) NOT NULL COMMENT 'Username',
    `password`        varchar(64)  NOT NULL COMMENT 'Password md5',
    `secret_key`      varchar(256)          DEFAULT NULL COMMENT 'Auth key for public network access',
    `public_key`      text                  DEFAULT NULL COMMENT 'Public key for asymmetric data encryption',
    `private_key`     text                  DEFAULT NULL COMMENT 'Private key for asymmetric data encryption',
    `encrypt_version` int(11)               DEFAULT NULL COMMENT 'Encryption key version',
    `account_type`    int(11)      NOT NULL DEFAULT '1' COMMENT 'Account type, 0-manager 1-normal',
    `due_date`        datetime              DEFAULT NULL COMMENT 'Due date for user',
    `ext_params`      text COMMENT 'Json extension info',
    `status`          int(11)               DEFAULT '100' COMMENT 'Status',
    `is_deleted`      int(11)               DEFAULT '0' COMMENT 'Whether to delete, 0 is not deleted, if greater than 0, delete',
    `creator`         varchar(256) NOT NULL COMMENT 'Creator name',
    `modifier`        varchar(256)          DEFAULT NULL COMMENT 'Modifier name',
    `create_time`     datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time',
    `modify_time`     datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time',
    `version`         int(11)      NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification',
    PRIMARY KEY (`id`),
    UNIQUE KEY `unique_user_name` (`name`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='User table';

then create upgrade.sql like this:

USE test;
ALTER TABLE `user`
    DROP COLUMN  `update_time`,
    DROP COLUMN  `create_by`,
    DROP COLUMN  `update_by`,
    ADD COLUMN  `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time' ,
    ADD COLUMN  `encrypt_version` int(11) DEFAULT NULL COMMENT 'Encryption key version' ,
    MODIFY COLUMN  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key' ,
    MODIFY COLUMN  `account_type` int(11) NOT NULL DEFAULT '1' COMMENT 'Account type, 0-manager 1-normal' ,
    ADD COLUMN  `public_key` text DEFAULT NULL COMMENT 'Public key for asymmetric data encryption' ,
    ADD COLUMN  `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification' ,
    ADD COLUMN  `status` int(11) DEFAULT '100' COMMENT 'Status' ,
    ADD COLUMN  `modifier` varchar(256) DEFAULT NULL COMMENT 'Modifier name' ,
    ADD COLUMN  `secret_key` varchar(256) DEFAULT NULL COMMENT 'Auth key for public network access' ,
    ADD COLUMN  `private_key` text DEFAULT NULL COMMENT 'Private key for asymmetric data encryption' ,
    ADD COLUMN  `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0 is not deleted, if greater than 0, delete' ,
    MODIFY COLUMN  `due_date` datetime DEFAULT NULL COMMENT 'Due date for user' ,
    ADD COLUMN  `ext_params` text COMMENT 'Json extension info' ,
    MODIFY COLUMN  `name` varchar(256) NOT NULL COMMENT 'Username' ,
    MODIFY COLUMN  `password` varchar(64) NOT NULL COMMENT 'Password md5' ,
    ADD COLUMN  `creator` varchar(256) NOT NULL COMMENT 'Creator name' ,
    DROP INDEX `unique_user_name_idx`,
    ADD CONSTRAINT `unique_user_name` UNIQUE (`name`);

create revert.sql like this

USE test;
ALTER TABLE `user`
    DROP COLUMN  `modify_time`,
    DROP COLUMN  `encrypt_version`,
    DROP COLUMN  `public_key`,
    DROP COLUMN  `version`,
    DROP COLUMN  `status`,
    DROP COLUMN  `modifier`,
    DROP COLUMN  `secret_key`,
    DROP COLUMN  `private_key`,
    DROP COLUMN  `is_deleted`,
    DROP COLUMN  `ext_params`,
    DROP COLUMN  `creator`,
    ADD COLUMN  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'update time' ,
    ADD COLUMN  `create_by` varchar(256) NOT NULL COMMENT 'create by sb.' ,
    MODIFY COLUMN  `due_date` datetime DEFAULT NULL COMMENT 'due date for account' ,
    ADD COLUMN  `update_by` varchar(256) DEFAULT NULL COMMENT 'update by sb.' ,
    MODIFY COLUMN  `id` int(11) NOT NULL AUTO_INCREMENT ,
    MODIFY COLUMN  `name` varchar(256) NOT NULL COMMENT 'account name' ,
    MODIFY COLUMN  `account_type` int(11) NOT NULL DEFAULT '1' COMMENT 'account type, 0-manager 1-normal' ,
    MODIFY COLUMN  `password` varchar(64) NOT NULL COMMENT 'password md5' ,
    DROP INDEX `unique_user_name`,
    ADD CONSTRAINT `unique_user_name_idx` UNIQUE (`name`);

only used for MySQL !!