什么是 Sequelize

我们知道 Web 应用开发中的 Web 后端开发一般都是 Java、Python、ASP.NET 等语言。十年前,Node.js 的出现使得原本仅限于运行在浏览器中的 JavaScript 也有了可以开发 Web 后端的机会了。

就对于 MySQL 来说,已经有了偏向于底层的框架 mysql npm 包,但现在要说的是一个基于 Promise 的 Node.js ORM 工具 —— Sequelize.js。结合 Express 来响应 HTTP 请求,定义路由表用于执行不同的 HTTP 请求动作,前端工程师可以基于 Node.js 开发一套服务器。

Sequelize.js 目前支持 Postgres、MySQL、MariaDB、SQLite 以及 Microsoft SQL Server。它具有强大的事务支持、关联关系、预读和延迟加载、读取复制等功能。

ORM 是对象关系映射(Object Relational Mapping)的简称,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

原生 API 的问题

如果 users 和 comments 是一对多的关系。在不使用 Sequelize 框架操作数据库时,对于关联查询,是这样操作的:

let sql = "select u.*, c.u_id, c.content from users as u inner join comments as c on u.id = c.u_id"

connection.query(sql, (err, result, fields) => {
res.send(result)
})

查询每一个用户发表的评论,所以查询的结果为:

点击查看代码
[
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容111"
},
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容222"
},
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容333"
}
]

查询结果显示,只有 content 字段的内容不一致,但结构是重复,我们希望得到的结果是这样的:

[
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": ["内容111", "内容222", "内容333"]
}
]

现在,是时候使用 Sequelize 来连接数据库进行操作了。

基于 Sequelize 开发接口

安装依赖

你需要保证你的项目需要有 mysql2、sequelize、express 三个依赖包,你可以选择一个干净的项目来进行实战。

npm install mysql2 express

连接数据库

导入 express、sequelize

const express = require('express')
const { Sequelize, DataTypes } = require('sequelize')

实例化 sequelize

Sequelize 类有四个构造函数,分别如下:

constructor(database: string, username: string, password?: string, options?: Options);
constructor(database: string, username: string, options?: Options);
constructor(options?: Options);
constructor(uri: string, options?: Options);

Options 定义的是一个 TS 接口,这个接口有更多的数据库配置信息,具体还有什么内容,查看源码。在这里,我选择使用第三个构造函数对数据库进行配置。

const sequelize = new Sequelize({
database: 'test',
username: 'shiramashiro',
password: '123456',
host: 'localhost',
port: 3306,
dialect: 'mysql' // 该字段指定要连接的数据库
})

创建数据表

定义模型

模型是 Sequelize 用于描述 JS 对象与数据库表的映射关系。

const User = sequelize.define('user', {
username: DataTypes.TEXT,
password: {
type: DataTypes.STRING(11),
defaultValue: '123456'
}
}) const Comment = sequelize.define('comment', {
content: DataTypes.TEXT
})

关联模型

在使用关联查询之前,需要让 Sequelize 知道数据库表之间的关系,是一对一,还是一对多,还是多对多。

Sequelize 提供了四种关联方法:HasOne 、BelongsTo 关联类型、HasMany 关联类型、BelongsToMany 关联类型。

根据当前文章案例,我需要使用 HasMay 关联类型和 BelongsTo 关联类型。

/**
* 关联模型,一对多,User 与 Comment 是一对多的关系。
*/
User.hasMany(Comment)
Comment.belongsTo(User)

添加数据

Sequelize 为我们提供了批量添加数据的方法,即 bulkCreate 方法。

点击查看代码

User.bulkCreate([
{
username: 'shiramashiro',
password: '654321'
},
{
username: 'javascript',
password: 'js123456'
}
]) Comment.bulkCreate([
{
content: '内容111',
userId: 1
},
{
content: '内容222',
userId: 1
},
{
content: '内容333',
userId: 1
},
{
content: '内容444',
userId: 2
},
{
content: '内容555',
userId: 2
}
])

关联查询

定义好模型和模型之间的关系之后,我们就可以开始进行关联查询了。

User.findAll({ include: Comment })
.then((result) => {
res.send(result)
})
.catch((error) => {
console.log(error)
})

最后呈现的数据如下:

点击查看代码
[
{
"id": 1,
"username": "shiramashiro",
"password": "654321",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"comments": [
{
"id": 3,
"content": "内容333",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
},
{
"id": 2,
"content": "内容222",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
},
{
"id": 1,
"content": "内容111",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
}
]
},
{
"id": 2,
"username": "javascript",
"password": "js123456",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"comments": [
{
"id": 5,
"content": "内容555",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 2
},
{
"id": 4,
"content": "内容444",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 2
}
]
}
]

结合 Express 开发接口

对于上面的查询方法,我们可以设计一个 HTTP API 接口,供前端项目使用。

const express = require('express')
const app = express() app.get('/', (req, res) => {
User.findAll({ include: Comment })
.then((result) => {
res.send(result)
})
.catch((error) => {
console.log(error)
})
}) app.listen(3000, () => { console.log('server was running at 3000...') })

总结

在编程中,把面向对象的概念跟数据库中表的概念对应起来。ORM 的好处就是不用操作表,可以在程序中用面向对象的思路,直接操作对象即可。Sequelize 基于这样的程序设计技术,为我们提供了大量的可操作数据库的方法。比如 bulkCreate 批量插入数据,我们只需要直接调用方法即可,Sequelize 会自动为我们生成 SQL 语句。

基于 Sequelize.js + Express.js 开发一套 Web 后端服务器的更多相关文章

  1. Angular JS + Express JS入门搭建网站

    3月份开始,接到了新的任务,跟UI开发有关,用的是Angular JS,Express JS等技术.于是周末顺便学习下新技术. 组里产品UI架构如下: 其中前端,主要使用Angular JS框架,另外 ...

  2. socket.io+angular.js+express.js做个聊天应用(三)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/www19940501a/article/details/27590611 接着前面博客文章socke ...

  3. soket.io.js + angular.js + express.js(node.js)

    soket.io.js + angular.js + express.js(node.js) 今天搭建个soket.io.js + angular.js + express.js的环境, 采坑无数,特 ...

  4. express:webpack dev-server开发中如何调用后端服务器的接口?

    开发环境:     前端:webpack + vue + vue-resource,基于如下模板创建的开发环境: https://github.com/vuejs-templates/webpack  ...

  5. 【nodejs笔记1】配置webstorm + node.js +express + mongodb开发博客的环境

    1. 安装webstorm 并破解 2. 安装node (以及express框架) 至官网下载并安装.(http://nodejs.org)v0.10.32   msi  安装后测试,打开命令行, c ...

  6. Node.js + Express + Mongodb 开发搭建个人网站(三)

    三.后台架构 1.在根目录下(和 views 文件夹同级)创建 lib 文件夹 以后所有后端内容 都是在这里写,分别创建三个文件夹 到 lib 目录下: mongo  放的是数据的存储 module  ...

  7. Node.js + Express + Mongodb 开发搭建个人网站(二)

    二.路由 1.打开 routes/index.js ,这个意思就是  捕获到访问主页的get请求: 并通过 app.js 分配到对应的路由里: 看到这里,打开 http://127.0.0.1:300 ...

  8. Node.js + Express + Mongodb 开发搭建个人网站(一)

    一.Node + Express环境搭建 0.去Node官网下载安装node,如果安装了 npm 和 node的话 那么就 安装 全局的 express,-g全局安装 npm install expr ...

  9. Node.js + Express + Knex 开发 API 接口

    安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...

随机推荐

  1. Mysql命令行插入字段超长不报错,而jdbc报错问题分析

    异常信息 exception.ServiceException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long ...

  2. Unicode和中午互转

    import java.io.UnsupportedEncodingException; public class TestUnicode{ /* * 中文转unicode编码 */ public s ...

  3. MySQL、SqlServer、Oracle,这三种数据库的优缺点,你知道吗?

    盘点MySQL.SqlServer.Oracle 三种数据库优缺点 MySQL SqlServer Oracle 一.MySQL 优 点 体积小.速度快.总体拥有成本低,开源:支持多种操作系统:是开源 ...

  4. Linux静默安装Oracle21C

    Linux静默安装Oracle21C 1.修改主机名及配置hosts [root@localhost ~]# hostname # 查看主机名 [root@localhost ~]# hostname ...

  5. SSMS设置为深色模式

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2022年2月8日. 2022年4月16日:SSMS很好用,但现在我更多使用DataGrip了. 2022年6月11日:S ...

  6. Vue回炉重造之封装一个实用的人脸识别组件

    前言 人脸识别技术现在越来越火,那么我们今天教大家实现一个人脸识别组件. 资源 element UI Vue.js tracking-min.js face-min.js 源码 由于我们的电脑有的有摄 ...

  7. 监控pos收银机

    1.打开pos收银机snmp功能 控制面板-->程序和功能-->启用或关闭windows功能→简单网络管理协议(SNMP) 2.配置snmp服务 控制面板-->管理工具-->服 ...

  8. Windows启动谷歌浏览器Chrome失败(应用程序无法启动,因为应用程序的并行配置不正确)解决方法

    目录 一.系统环境 二.问题描述 三.解决方法 一.系统环境 Windows版本 系统类型 浏览器Chrome版本 Windows 10 专业版 64 位操作系统, 基于 x64 的处理器 版本 10 ...

  9. python这不是有手就行?——python音频处理基础知识

    大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...

  10. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...