持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
概述
最近学习 Nodejs ,发现 Sequelize 很好使用,在这里记录一下相关学习,希望能给有相同需要的同学一些帮助,也希望能够相互交流一下各自的学习经验,如果有写的不对的地方,希望可以指正,如果觉得写的可以,可以给我点个赞,谢谢!
Sequelize 介绍
官方是这样介绍的 Sequelize 是一个基于 promise 的 Node.js ORM,目前支持的数据库有
- Postgres
- MySQL,
- MariaDB,
- SQLite以及
- Microsoft SQL Server
它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能
数据库连接
数据库的连接方式有好几种,
const { Sequelize } = require('sequelize');
// 方法 1: 传递一个连接 URI
const sequelize = new Sequelize('sqlite::memory:') // Sqlite 示例
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname') // Postgres 示例
// 方法 2: 分别传递参数 (其它数据库)
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
});
数据库连接方式定义后,我们可以加一个测试方式来验证下数据库是否连接成功
(async () => {
try {
await sequelize.authenticate()
console.log('已成功建立连接');
} catch (error) {
console.error('连接失败', error);
}
})();
模型定义
在 Sequelize 中定义模型有两种等效的方法
- 调用
sequelize.define(modelName, attributes, options) - 扩展
Model并调用init(attributes, options)
比如:
module.exports = (sequelize, Sequelize) => {
const Article = sequelize.define("article", {
title: {
type: Sequelize.STRING
},
description: {
type: Sequelize.STRING,
allowNull: false
},
status: {
type: Sequelize.BOOLEAN,
}
});
return Article;
};
创建表
初次运行,我们有可能要创建表,我们可以使用 model.sync() 方法,调用这个方式会返回一个 Promise,且会自动创建主键,默认为id,调用 model.sync() 还可以传入参数
- model.sync() 如果表不存在,则创建表,如果存在则不做任何操作
- model.sync({ force: true }) 将创建表,如果存在,则会将表删除后重建
- User.sync({ alter: true }) 会检查数据库中的字段,如果和模型不匹配则会删除重建
增删改查
-
新增:Sequelize 新增数据 提供了 一个
create方法,相当于build和save两个方法的合并,使用起来很是方便const jane = await User.create({ name: "Jane" }); -
批量新增:model.bulkCreate([model,...],{...}) ;
-
更新数据可以使用
updateawait article.update({ title: "xxx" }) -
删除数据
await article.destroy(); -
重载实例
我们通过调用
reload从数据库中重新加载实例await jane.reload(); -
仅保存部分字段
通过传递一个列名数组,可以定义在调用
save时应该保存哪些属性.save({fields:[ 'name',... ]}) 只更新数组里面的字段调用这个方法只更新传递的字段
-
查询
-
findAll会读取数据库中整个表,也可以配合
attributes可以使用嵌套数组来重命名属性Model.findAll({ attributes: ['foo', ['bar', 'baz'], 'qux'] });同样,也可以排除某些属性
Model.findAll({ attributes: { exclude: ['baz'] } }); -
findByPk根据主键查找 -
findOne找到第一个实例const project = await Project.findOne({ where: { title: 'My Title' } }); -
findOrCreate除非找到一个满足查询参数的结果,否则方法findOrCreate将在表中创建一个条目 -
findAndCountAll分页查找const { count, rows } = await Project.findAndCountAll({ where: { title: { [Op.like]: 'foo%' } }, offset: 10, limit: 2 }); console.log(count); console.log(rows);
-
原始查询
const { QueryTypes } = require('sequelize');
const articls = await sequelize.query("SELECT * FROM `articls`");//参数是sql语句