在使用 node 开发项目的过程中,不可避免要用 model 来映射数据库中的表结构与字段。
什么意思呢?
数据库操作
我们知道,数据库中的表,只能通过 SQL 语句来访问,比如在用户表中查找用户名为admin
的用户:
SELECT*FROMusersWHEREname='admin'
而在 node 项目中,当我们需要在数据库中进行增删改查的操作,无非也是通过网络发送增删改查的 sql 语句来实现。
这样做,就带来一些问题
一方面,要求开发人员要掌握 sql 的基本知识,在代码层面能熟练的编写 sql 语句,
另一方面,还要求开发人员有一定的网络安全知识,能避免常见的注入 sql注入 之类的安全漏洞。
而且,这样编写出来的代码也比较底层,可能不太符合程序员的思维。
所以社区就有了 ORM 。
ORM
有些人可能想到,一个数据表和我们页面中常用的 table 表有什么区别呢?
下面是一个 websites 的数据表
+----+--------------+---------------------------+-------+---------+|id|name|url|alexa|country|+----+--------------+---------------------------+-------+---------+|1|Google|https://www.google.cm/|1|USA||2|淘宝|https://www.taobao.com/|13|CN||3|菜鸟教程|http://www.runoob.com/|4689|CN||4|微博|http://weibo.com/|20|CN||5|Facebook|https://www.facebook.com/|3|USA|+----+--------------+---------------------------+-------+---------+
如果表里的数据放到前端的页面里,可能是这样子的:
而我们的 table 却是从普通的 javascript 数组对象结构渲染而来。比如
vartable=[{id:1,name:'Google',url:'https://www.google.cm/',alexa:1,country:'USA'}...]
如果数据库的增删改查的操作,能和操作普通的 javascript 数组一样,那多好~
于是就产生了 ORM(Object-Relational Mapping)技术,将数据库中的表结构映射为对象,想要操作数据库,直接操作映射的对象就行了。
那如何将数据库中的表映射为代码中的对象呢?
这就要用到 ORM 框架了。
利用 egg-sequelize-auto 快速生成表模型
有时候,我们的数据库已经建表了,而代码中对应的模型(映射对象,以下统称为 model)还没建立,那有什么办法能通过建立好的表来生成 model 吗?
我们这里选择 ORM 框架 sequelize。它是一个基于 Promise 的 node ORM 框架,支持 Postgres, MySQL, MariaDB, SQLite 等多种数据库。
我们要执行的步骤如下,
全局安装 egg-sequelize-auto 与 mysql2
npm install -g egg-sequelize-auto
npm install -g mysql2
进入项目文件夹
cd egg-demonstrate
用如下的命令生成需要的表结构
egg-sequelize-auto -o "./model" -d databaseName -h localhost -u username -p port -x password -t tableName
参数说明
-h, --host 数据库的IP地址 [required]
-d, --database 数据库名 [required]
-u, --user 用户名
-x, --pass 密码
-p, --port 端口
-c, --config 配置文件[require json file]
-o, --output 目标文件夹
-t, --tables 数据表表名
-e, --dialect The dialect/engine that you're using: postgres, mysql, sqlite
example
假设我有如下的开发环境
项目文件夹为 egg-demonstrate
数据库地址为 192.168.0.205
数据库名称为 digapisids
数据表名称为 userlogs
用户名 root
密码 123456
如生成用户日志表(userlogs)模型
egg-sequelize-auto -o "./model" -h 192.168.0.205 -d digapisids -u root -x 123456 -p 3306 -t userlogs
执行上面的语句,在 model 文件夹中就可以看到生成了一个文件,是针对用户日志的表(userlogs)的模型 userlogs.js
如果数据库有很多的表,出了userlogs,还有 users,whitelist,blacklist
我想一次性生成所有表模型
egg-sequelize-auto -o "./model" -d digapisids -h 192.168.0.205 -u root -x 123456 -p 3306 -e mysql
在 model 文件夹中就可以看到生成了许多文件
如何使用生成的 model 进行增删改查
如:查询用户表中的所有用户
this.ctx.model.models.user.findAndCountAll({offset,limit,order:[['id','desc']],attributes:['id','username','is_superuser','date_joined']});
其他的案例请查看文档
示例:https://www.npmjs.com/package/egg-sequelize-auto
码云:https://gitee.com/eosgravity/egg-sequelize-auto
作者:晴天同学98202