七、Sequelize(基于promise的node.js ORM)
sequelize:https://www.sequelize.com.cn/
npm install --save sequelize
npm install --save mysql2
7.1 node.js和js,ORM
一个是基于浏览器端的 javascript (前端 JS)
一个是基于服务端的 javascript (后端 Node.js)
语法一样
组成不一样
JavaScript:
ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象)
DOM(一些操作页面元素的方法)
BOM(一些操作浏览器的方法)
Node.js:
ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象)
OS(操作系统)
file(文件系统)
net(网络系统)
ORM:其实以面向对象的思想,定义mode对应数据库的表,通过对model的操作实现对数据库表的操作。
7.2 数据库连接配置
var Sequelize = require(“sequelize”);
var sequelize = new Sequelize(‘my_database’, ‘root’, ‘db-password’, {
host: “localhost”,
port: 3306,
dialect: ‘mysql’
});
7.3 模型基础
(1)定义模型
var sequelize = new Sequelize();
sequelize.define(modelName, attributes, options);
const { Sequelize, DataTypes, Model } = require(‘sequelize’);
class User extends Model {}
User.init({}}
(2)访问模型
sequelize.models.User
(3)当未提供表名时,Sequelize 会自动将模型名复数并将其用作表名
可以使用 freezeTableName: true强制表名和模型名相等,options里面配置
还可以通过tableName: 'Employees’直接提供表名。options里面配置
(4)模型同步
同步User模型:await User.sync()
同步所有模型:await sequelize.sync();
(5)删除表
删除单个表:await User.drop();
删除所有表:await sequelize.drop();
7.4 模型操作方法
1.插入
const user = await User.create({ username: ‘Jane’,password: ‘97888’ }); //插入
user.name = ‘kkk’;
await user.save(); //更新
await user.destory(); //删除
const captains = await Captain.bulkCreate([ { name: ‘Jack Sparrow’ }, { name: ‘Davy Jones’ }]); // 批量插入数据
2.查询
Model.findAll()
相当于:select * from …
Model.findAll({ attributes: [‘foo’, ‘bar’]})
相当于: select foo,bar from …
Model.findAll({ attributes: [‘foo’, [‘bar’, ‘baz’], ‘qux’]});
相当于:SELECT foo, bar AS baz, qux FROM …
Model.findAll({ attributes: [ ‘foo’, [sequelize.fn(‘COUNT’, sequelize.col(‘hats’)), ‘n_hats’], ‘bar’ ]});
相当于:SELECT foo, COUNT(hats) AS n_hats, bar FROM …
select … from user
where …
group by …
order by …
limit 10,1.
3.更新
// UPDATE user
SET password
=? WHERE username
= ?
const user = await User.update({ password: “helloworld” }, {
where: {
username: 'wmz'
}
});
4.删除
// DELETE FROM user
WHERE username
= ‘wmz’
const user = await User.destroy({
where: {
username: 'wmz',
}
});
7.5 获取器,设置器
设置器就是在存入数据库之前对其进行处理之后再存入数据库,获取器同理在获取之后进行处理
7.6 验证,约束
约束:
allowNull: false,
unique: true // 唯一性
验证器:
7.7 原始查询
const [results, metadata] = await sequelize.query("UPDATE users SET y = 42 WHERE x = 12");
7.8 关联查询
7.9 偏执表
Sequelize 支持 paranoid 表的概念. 一个 paranoid 表是一个被告知删除记录时不会真正删除它的表.反而一个名为 deletedAt 的特殊列会将其值设置为该删除请求的时间戳.
这意味着偏执表会执行记录的 软删除,而不是 硬删除.
八、egg的简单使用
EGG:https://eggjs.org/zh-cn/intro/quickstart.html
8.1 内置对象
1.Application 对象
几乎可以在编写应用时的任何一个地方获取到,下面介绍几个经常用到的获取方式
作为参数传递
在继承于 Controller, Service 基类的实例中,可以通过 this.app 访问到 Application 对象。
在 Context 对象上,可以通过 ctx.app 访问到 Application 对象
2.context对象
Context 是一个请求级别的对象,继承自 Koa.Context。在每一次收到用户请求时,框架会实例化一个 Context 对象,这个对象封装了这次用户请求的
信息,并提供了许多便捷的方法来获取请求参数或者设置响应信息。框架会将所有的 Service 挂载到 Context 实例上,一些插件也会将一些其他的方法和
对象挂载到它上面(egg-sequelize 会将所有的 model 挂载在 Context 上)。
获取方式:
3.request和response
通过ctx.request获取请求报文,通过ctx.response获取响应报文
ctx.request.query.id 和 ctx.query.id 是等价的,ctx.response.body= 和 ctx.body= 是等价的。
router.get(’/addOne/:taskname’, controller.home.addOne);
8.2 router,controller,service,model
router.get('/getAll', controller.home.findAll);
class HomeController extends Controller {
async findAll() {
const res = await this.ctx.service.home.findAll();
this.success(res);
}
}
class HomeService extends Service {
// 获取所有事项
async findAll() {
// ctx - 当前请求的 Context 实例
const todolist = this.ctx.model.models.todolist;
return await todolist.findAll();
}