sequelize-auto从数据库表自动生成Sequelize模型(Model)

 2016年08月03日    1437     声明


某兄基于Sequelize实现ORM,其数据库中已有很多张表,如果手工建立模型(Model)会花费很多时间,因此需要一种比较便捷的建立模型的方式。笔者所参与的项目中,从项目初始阶段就使用Sequelize进行数据库表结构的维护,如果遇到表结构修改的情况会手调整模型结构,并手工编写SQL脚本修改表结构或使用sequelize.sync({force:true})来重建表。对于基于现有数据库表创建模型的情况,Sequelize官方提供了一个命令行(CLI)工具sequelize-auto,可以非常方便的从现有数据库表结构生成标准的Sequelize模型。


  1. sequelize-auto安装及依赖模块
  2. 使用参数
  3. 使用示例

1. sequelize-auto安装及依赖模块

sequelize-auto会以命令行的形式自动生成SequelizeJS的模型Model

要以命令行的形式使用需要全局安装模块:

npm install -g sequelize-auto

依赖模块

使用sequelize-auto前,还需要全局安装一个你所使用的数据库驱动。

如果使用MySQL/MariaDB,需要安装mysql

npm install -g mysql

如果使用Postgres,需要安装pgpg-hstore两个模块:

npm install -g pg pg-hstore

使用Sqlite3需要安装sqlite

npm install -g sqlite

使用MSSQL请安装tedious

npm install -g tedious


2. 使用参数

全局安装sequelize-auto安装及依赖模块后,就可使用该模块生成模型了。语法结构如下:

 sequelize-auto -h  -d  -u  -x [password] -p [port]  --dialect [dialect] -c [/path/to/config] -o [/path/to/models] -t [tableName]

在以上参数中,除-h-d参数外,其它参数都是可选的。各参数选项说明如下:

  • -h, --host - 数据库的IP/主机名 [必选]
  • -d, --database - 数据库名 [必选]
  • -u, --user - 数据库的用户名。默认将根据数据库类型的默认用户生成数据库名
  • -x, --pass - 数据库的密码。默认为空
  • -p, --port - 数据库连接端口。默认为所使用数据库类型的默认端口号
  • -c, --config - JSON文件,用于Sequelize构造函数的'options'选项对象。参见:http://itbilu.com/nodejs/npm/VkYIaRPz-.html#api-init
  • -o, --output - 模型输出目录。默认会在当前目录下生成'./models'目录
  • -e, --dialect - 所使用的数据库类型(驱动类型)。默认为mysql
  • -a, --additional - 一个包含模型定义参数的JSON文件。参见:http://itbilu.com/nodejs/npm/VkYIaRPz-.html#api-instance-define
  • -t, --tables - 指定所要导出的表,逗号分隔。默认为全部


3. 使用示例

一个sequelize-auto官方提供的示例:

sequelize-auto -o "./models" -d sequelize_auto_test -h localhost -u my_username -p 5432 -x my_password -e postgres

在这个示例中,通过-o参数提定了输出目录,-d参数指定了数据库名,-h参数指定了数据库主机,-u参数指定了数据库用户名,-p参数指定了数据库访问端口,-x参数指定了数据库密码,-e参数指定了数据库类型为Postgre。其生成的模型文件会保存在./models目录下,在这个示例中会存在一个Users.js模型,结构如下:

/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('Users', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    username: {
      type: DataTypes.STRING,
      allowNull: true
    },
    touchedAt: {
      type: DataTypes.DATE,
      allowNull: true
    },
    aNumber: {
      type: DataTypes.INTEGER(11),
      allowNull: true
    },
    bNumber: {
      type: DataTypes.INTEGER(11),
      allowNull: true
    },
    validateTest: {
      type: DataTypes.INTEGER(11),
      allowNull: true
    },
    validateCustom: {
      type: DataTypes.STRING,
      allowNull: false
    },
    dateAllowNullTrue: {
      type: DataTypes.DATE,
      allowNull: true
    },
    defaultValueBoolean: {
      type: DataTypes.BOOLEAN,
      allowNull: true,
      defaultValue: '1'
    },
    createdAt: {
      type: DataTypes.DATE,
      allowNull: false
    },
    updatedAt: {
      type: DataTypes.DATE,
      allowNull: false
    }
  }, {
    tableName: 'Users',
    freezeTableName: true
  });
};

模型导出后,可以很简单通过sequelize.import方法将其导入。但在使用时也应该注意,导出时模型名与表名是一致的(如:上例中的User),而ModelSequelize中是以类的方式提供的(“类”通常使用首字母大写的命名方式),而在数据库中表命名往往不一致。这样我们还需要对导出的模型做一定处理,但这已经节约了我们很大一部分工作量,我们已经不需要手工指定字段类型及处理表间关系等。

一个更简化的使用示例

在使用sequelize-auto时,传入参数也可以更简单一些。如:只设置mysql的用户和密码,就可以像下在这样:

sequelize-auto -h localhost -d mydb -u root -x 111111 

在上例中,除-h-d两个必选参数外,只通过-u-x指定了用户名和密码,甚至没有指定所使用的数据库类型(默认使用mysql数据库),其它选项sequelize-auto自动配置。