某兄基于Sequelize
实现ORM,其数据库中已有很多张表,如果手工建立模型(Model
)会花费很多时间,因此需要一种比较便捷的建立模型的方式。笔者所参与的项目中,从项目初始阶段就使用Sequelize
进行数据库表结构的维护,如果遇到表结构修改的情况会手调整模型结构,并手工编写SQL脚本修改表结构或使用sequelize.sync({force:true})
来重建表。对于基于现有数据库表创建模型的情况,Sequelize
官方提供了一个命令行(CLI
)工具sequelize-auto
,可以非常方便的从现有数据库表结构生成标准的Sequelize
模型。
1. sequelize-auto
安装及依赖模块
sequelize-auto
会以命令行的形式自动生成SequelizeJS的模型Model
。
要以命令行的形式使用需要全局安装模块:
npm install -g sequelize-auto
依赖模块
使用sequelize-auto
前,还需要全局安装一个你所使用的数据库驱动。
如果使用MySQL/MariaDB
,需要安装mysql
:
npm install -g mysql
如果使用Postgres
,需要安装pg
、pg-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
),而Model
在Sequelize
中是以类的方式提供的(“类”通常使用首字母大写的命名方式),而在数据库中表命名往往不一致。这样我们还需要对导出的模型做一定处理,但这已经节约了我们很大一部分工作量,我们已经不需要手工指定字段类型及处理表间关系等。
一个更简化的使用示例
在使用sequelize-auto
时,传入参数也可以更简单一些。如:只设置mysql
的用户和密码,就可以像下在这样:
sequelize-auto -h localhost -d mydb -u root -x 111111
在上例中,除-h
、-d
两个必选参数外,只通过-u
、-x
指定了用户名和密码,甚至没有指定所使用的数据库类型(默认使用mysql
数据库),其它选项sequelize-auto
自动配置。