npm package: @icreate/ics-db-migrate
Description: ``` npm i @icreate/ics-db-migrate ```
Author: chujinzhu
Latest version: 0.0.4

#### 安装

```
npm i @icreate/ics-db-migrate
```

#### 引用

- DataType 数据类型。
- DBType 数据库类型枚举。

```
import { createDBMigrate, DataType as type, DBType } from @icreate/ics-db-migrate
```

#### 创建 DBMigrate

- 现支持 mssql 及 Oracle 数据库

```
var sqlBuilder = createDBMigrate(DBType.mssql)
```

#### 建表

- createTable 入参：表名，列定义，表中文名
- 列定义：

```
{
    name: string                    // 中文名
    primaryKey: boolean             // 主键
    notNull: boolean                // 不可为空
    autoIncrement: boolean          // 自增
    type: string                    // 数据类型
    length: number                  // 长度
    precision: number               // 精度
    comment: string                 // 说明
    defaultValue: string | number   // 默认值
    foreignKey: {                   // 外键
      name: string                  // 外键名
      table: string                 // 关联表
      mapping: string               // 关联列
    }
}
```

```
// 创建列定义

var colOptions = {
  ID: {
    name: '主键ID',
    primaryKey: true,
    notNull: true,
    type: type.VarChar,
    length: 50
  },
  NAME: {
    name: '名称',
    notNull: true,
    type: type.VarChar,
    length: 200
  },
  SEX: {
    name: '性别',
    notNull: true,
    type: type.VarChar,
    length: 20
  },
  AGE: {
    name: '年龄',
    notNull: true,
    type: type.Int
  }
}

sqlBuilder.createTable('TEST', colOptions, '测试表')
```

#### TRUNCATE 表

- truncate 入参：表名

```
sqlBuilder.truncate('TEST')
```

#### 创建视图

- createView 入参：视图名，查询 SQL

```
sqlBuilder.createView('VIEW_TEST', `SELECT ID, NAME, AGE FROM TEST`)
```

#### 创建函数

- createView 入参：函数名，函数创建 SQL

```
// 函数SQL

const SQL =
`
create function FUNC_TEST
([p1,p2...pn])
return datatype
is|as
--声明部分
begin
--PL/SQL程序块
end
`

sqlBuilder.createFunction('FUNC_TEST', SQL)
```

#### 创建存储过程

- createProcedure 入参：存储过程名，存储过程创建 SQL

```
// 存储过程SQL

const SQL =
`
create procedure 存储过程名（param1 in type，param2 out type）
as
  变量1 类型（值范围）;
  变量2 类型（值范围）;
begin
  select count(*) into 变量1 from 表A where列名=param1；
  if (判断条件) then
  select 列名 into 变量2 from 表A where列名=param1；
  dbms_output.Put_line('打印信息');
  elsif (判断条件) then
  dbms_output.Put_line('打印信息');
  else
  raise 异常名（NO_DATA_FOUND）;
  end if;
exception
  when others then
  rollback;
end;
`

sqlBuilder.createProcedure('PROC_TEST', SQL)
```

#### DROP 表

- dropTable 入参：表名

```
sqlBuilder.dropTable('TEST')
```

#### DROP 视图

- dropView 入参：视图名

```
sqlBuilder.dropView('VIEW_TEST')
```

#### DROP 函数

- dropFunction 入参：函数名

```
sqlBuilder.dropFunction('FUNC_TEST')
```

#### DROP 存储过程

- dropProcedure 入参：存储过程名

```
sqlBuilder.dropProcedure('PROC_TEST')
```

#### 新增列

- addColumn 入参：表名，列名，列定义（如上：建表列定义）

```
// 列定义

const option = {
  name: '备注',
  type: type.VarChar,
  length: 1000
}

sqlBuilder.addColumn('TEST', 'REMARK', option)
```

#### 删除列

- removeColumn 入参：表名，列名

```
sqlBuilder.removeColumn('TEST', 'REMARK')
```

#### 修改列

- changeColumn 入参：表名，列名，列定义（如上：建表列定义）

```
option.length = 2000

sqlBuilder.changeColumn('TEST', 'REMARK', option)
```

#### 新增索引

- addIndex 入参：表名，索引名，列集合，是否唯一索引

```
sqlBuilder.addIndex('TEST', 'IX_TEST_NAME', ['NAME'], false)
```

#### 删除索引

- removeIndex 入参：表名，索引名

```
sqlBuilder.removeIndex('TEST', 'IX_TEST_NAME')
```

#### insert

- insert 入参：表名，数据对象或数组

```
var data = {
  ID: '123456789',
  NAME: '666666',
  SEX: '男',
  AGE: 19
}

sqlBuilder.insert('TEST', data)
```

#### update

- update 入参：表名，数据对象，条件对象

```
var data = {
  SEX: '男',
  AGE: 19
}

var where = {
  ID: '123456789'
}

sqlBuilder.update('TEST', data, where)
```

#### remove

- remove 入参：表名，条件对象

```
var where = {
  ID: '123456789'
}

sqlBuilder.remove('TEST', where)
```

#### 新增外键

- addForeignKey 入参：外键名称，表名，列名，外键表名，字段映射，约束规则

```
sqlBuilder.addForeignKey('fk_test','TEST','NAME','TEST2','NAME')
```

#### 删除外键

- removeForeignKey 入参：表名，外键名称

```
sqlBuilder.removeForeignKey('TEST','fk_test')
```

#### 获取sql

- text 

```
var sqlText = sqlBuilder.text()
```