简单高效的migrate工具,可以根据模型配置文件自动生成迁移语句,开发人员只需要关注配置文件的增删改即可,无需关心迁移的语句
- 本工具的模型管理是基于sequelize,如需要手动修改migration文件,请参考它的API
- 模型配置文件简单,目前只支持MySQL,根据配置文件的变化和数据库当前表结构的对比,自动生成迁移语句,开发人员只需要维护配置文件即可
- 根据MySQL常用的数据类型,目前只支持MySQL的INT、VARCHAR、DECIMAL、DATETIME、DATE、TEXT、LONGTEXT,其他类型,如FLOAT、DOUBLE,可以使用DECIMAL代替,CHAR使用VARCHAR代替
- 后续版本会支持更多种数据库,sequelize支持的都可以
$ npm i easy-migrate -g
$
$ migrate
Usage: migrate [options] [command]
Options:
-V, --version output the version number
-h, --help output usage information
Commands:
config show migrate config
create Create a new migration
up Migrate up to a give migration version, default lastest
down Migrate down to a given migration version, default current pre-version
help [cmd] display help for [cmd]
$ migrate create -h
Usage: migrate-create [options] <name>
Options:
-V, --version output the version number
--define-path <path> Set define file path
--db-config-path <path> Set db config path
--migrations-path <path> Set migrations out path
--model-path <path> Set sequelize model file out path
-h, --help output usage information
- --define-path: 执行模型配置文件的目录(项目开发过程中一般按模块开发的话,模型也应该是模块级的),可以是一个文件,也可以通过设置环境变量: MIGRATE_DEFINE_PATH
- --db-config-path: 数据库的配置文件路径,也可以通过设置环境变量: MIGRATE_DB_CONFIG_PATH
- --migrations-path: 生成的migration文件输出目录,也可以通过设置环境变量: MIGRATE_MIGRATIONS_PATH
- --model-path: 当项目使用sequelize作为orm工具的时候,model定义文件可以根据配置文件自动生成,配置输出目录即可,也可以通过设置环境变量: MIGRATE_MODEL_PATH
$ migrate create --define-path /path/to/define/somemodule --db-config-path /path/to/db/config --migrations-path /path/to/migrations
migration file '20181011164723-migration.js' created!
或者
$ MIGRATE_DEFINE_PATH=/path/to/define/somemodule MIGRATE_DB_CONFIG_PATH=/path/to/db/config MIGRATE_MIGRATIONS_PATH=/path/to/migrations migrate create
use MIGRATE_DB_CONFIG_PATH for db config: /path/to/db/config
use MIGRATE_DEFINE_PATH for define path: /path/to/entity/somemodule
use MIGRATE_MIGRATIONS_PATH for migrations path: /path/to/migrations
migration file '20181011164723-migration.js' created!
20181011164723-migration.js
'use strict';
/**
* Auto-created by execute migrate-create script, Please do not modify it manually!
*/
module.exports = {
up: async function (queryInterface, Sequelize) {
// add columns
await queryInterface.createTable('table_test1', {
columns1: {
type: Sequelize.INTEGER(11),
allowNull: false,
primaryKey: true,
autoIncrement: true,
comment: 'columns1 comment'
},
columns2: {
type: Sequelize.STRING(32),
allowNull: false,
comment: 'columns2 comment'
},
columns3: {
type: Sequelize.DECIMAL(11, 2),
defaultValue: 0,
allowNull: true,
comment: 'columns3 comment'
},
columns4: {
type: Sequelize.DATE,
comment: 'columns4 comment'
}
});
// modify columns
// drop columns
// drop indexs
// add indexs
await queryInterface.addIndex('table_test1', {
type: 'UNIQUE',
fields: ['columns2'],
name: 'index_columns2_un'
});
await queryInterface.addIndex('table_test1', {
fields: ['columns3', 'columns4'],
name: 'index_columns3_columns4'
});
},
down: async function (queryInterface, Sequelize) {
// add columns
// modify columns
// drop columns
await queryInterface.dropTable('table_test1');
// drop indexs
// add indexs
}
};
数据库配置文件如下:
module.exports = {
dialect: 'mysql',
database: 'database',
username: 'root',
password: 'admin@123',
timezone: '+08:00',
host: '127.0.0.1',
port: '3306',
};
模型配置文件如下:
module.exports = {
tableName: 'table_test1',
columns: {
columns1: {
type: 'integer',
length: 11,
allowNull: false,
primaryKey: true,
autoIncrement: true,
comment: 'columns1 comment'
},
columns2: {
type: 'string',
length: 32,
allowNull: false,
comment: 'columns2 comment'
},
columns3: {
type: 'decimal',
precision: 11,
scale: 2,
defaultValue: 0.00,
allowNull: true,
comment: 'columns3 comment'
},
columns4: {
type: 'date',
comment: 'columns4 comment'
}
},
indexs: {
index_columns2_un: {
type: 'UNIQUE',
fields: ['columns2']
},
index_columns3_columns4: {
fields: ['columns3', 'columns4']
}
}
};
$ migrate up -h
Usage: migrate-up [options] <name>
Options:
-V, --version output the version number
--db-config-path <path> Set db config path
--target-version <version> Migrate up to a give migration version, default lastest
--migrations-path <path> Set migrations path
-h, --help output usage information
- --db-config-path: 数据库的配置文件路径,也可以通过设置环境变量: MIGRATE_DB_CONFIG_PATH
- --target-version: 指定迁移的版本,默认是当前migration文件中版本最新的
- --migrations-path: migration文件所在目录,也可以通过设置环境变量: MIGRATE_MIGRATIONS_PATH
$ migrate up --db-config-path /path/to/db/config --migrations-path /path/to/migrations
now version is up to 20181011164723
或者
$ MIGRATE_DB_CONFIG_PATH=/path/to/db/config MIGRATE_MIGRATIONS_PATH=/path/to/migrations migrate up
use MIGRATE_DB_CONFIG_PATH for db config: /path/to/db/config
use MIGRATE_MIGRATIONS_PATH for migrations path: /path/to/migrations
now version is up to 20181011164723
mysql> show table table_test1;
| table_test1 | CREATE TABLE `table_test1` (
`columns1` int(11) NOT NULL AUTO_INCREMENT COMMENT 'columns1 comment',
`columns2` varchar(32) NOT NULL COMMENT 'columns2 comment',
`columns3` decimal(11,2) DEFAULT '0.00' COMMENT 'columns3 comment',
`columns4` datetime DEFAULT NULL COMMENT 'columns4 comment',
PRIMARY KEY (`columns1`),
UNIQUE KEY `index_columns2_un` (`columns2`),
KEY `index_columns3_columns4` (`columns3`,`columns4`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
$ migrate down -h
Usage: migrate-down [options] <name>
Options:
-V, --version output the version number
--db-config-path <path> Set db config path
--target-version <version> Migrate down to a give migration version, default lastest
--migrations-path <path> Set migrations path
-h, --help output usage information
- --db-config-path: 数据库的配置文件路径,也可以通过设置环境变量: MIGRATE_DB_CONFIG_PATH
- --target-version: 指定迁移的版本,默认是当前数据库最新版本
- --migrations-path: migration文件所在目录,也可以通过设置环境变量: MIGRATE_MIGRATIONS_PATH
$ migrate down --db-config-path /path/to/db/config --migrations-path /path/to/migrations
now version is down to 0
或者
$ MIGRATE_DB_CONFIG_PATH=/path/to/db/config MIGRATE_MIGRATIONS_PATH=/path/to/migrations migrate up
use MIGRATE_DB_CONFIG_PATH for db config: /path/to/db/config
use MIGRATE_MIGRATIONS_PATH for migrations path: /path/to/migrations
now version is down to 0