egg 项目快速创建 sequelize 的数据表模型

·  阅读 134
egg 项目快速创建 sequelize 的数据表模型

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

在使用 node 开发项目的过程中,不可避免要用 model 来映射数据库中的表结构与字段。

什么意思呢?

数据库操作

我们知道,数据库中的表,只能通过 SQL 语句来访问,比如在用户表中查找用户名为admin的用户:

SELECT * FROM users WHERE name='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     |
+----+--------------+---------------------------+-------+---------+
复制代码

如果表里的数据放到前端的页面里,可能是这样子的:

idnameurlalexacountry
1Googlewww.google.cm/1USA
2淘宝www.taobao.com/13CN
3菜鸟教程www.runoob.com/4689CN
4微博weibo.com/20CN
5Facebookwww.facebook.com/3USA

而我们的 table 却是从普通的 javascript 数组对象结构渲染而来。比如

var table = [
    {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 等多种数据库。

我们要执行的步骤如下,

  1. 全局安装 egg-sequelize-auto 与 mysql2

npm install -g egg-sequelize-auto

npm install -g mysql2

  1. 进入项目文件夹

cd egg-demonstrate

  1. 用如下的命令生成需要的表结构

egg-sequelize-auto -o "./model" -d databaseName -h localhost -u username -p port -x password -t tableName

  1. 参数说明

-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']
    });

复制代码

其他的案例请查看文档

示例:www.npmjs.com/package/egg…

码云:gitee.com/eosgravity/…

分类:
后端
标签: