sequelize多条件_Sequelize 快速入门
Sequelize
是一个基于 Promise 的 Node.js ORM,目前支持 Postgres、 MySQL 、SQLite 和 Microsoft SQL Server。它具有强大的事务支持,关联关系、读取和复制等功能。
安装
npm
// Using NPM
$ npm install --save sequelize
# And one of the following:
$ npm install --save pg pg-hstore
$ npm install --save mysql2
$ npm install --save sqlite3
$ npm install --save tedious // MSSQL
yarn
// Using Yarn
$ yarn add sequelize
# And one of the following:
$ yarn add pg pg-hstore
$ yarn add mysql2
$ yarn add sqlite3
$ yarn add tedious // MSSQL
本文所使用的第三方库的版本信息为:”sequelize”: “^4.39.0”、”mysql2”: “^1.6.1”。
建立 数据库 连接
const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql'|'sqlite'|'postgres'|'mssql',
operatorsAliases: false,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
// SQLite only
storage: 'path/to/database.sqlite'
});
// Or you can simply use a connection uri
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');
测试连接
这里以 mysql 数据库为例:
const Sequelize = require('sequelize');
const sequelize = new Sequelize(
'exe', // 数据库名称
'root', // 用户名
'', // 密码
{
host: 'localhost',
dialect: 'mysql', // 'mysql'|'sqlite'|'postgres'|'mssql'
operatorsAliases: false,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
});
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
需要注意的是,运行以上代码前需保证本机已安装并启动了 mysql。对于使用 MacOS 的小伙伴来说,可以通过 Homebrew
来安装和启动 mysql:
$ brew doctor # 确认 brew 是否正常。
$ brew update # 更新包
$ brew install mysql # 安装 mysql
$ brew services start mysql #启动 mysql
$ brew services restart mysql #重启 mysql
$ brew services stop mysql #关闭 mysql
定义模型
const Sequelize = require("sequelize");
module.exports = sequelize => {
const User = sequelize.define("user", {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
User.sync({
force: true
}).then(() => {
console.log("User Table has been created");
});
return User;
};
以上示例中 User.sync({force: true})
,将会先删掉表后再建表。当然,你也可以先定义好表结构,再来定义 Sequelize
模型,这时就不需要使用 sync 方法。两者在定义阶段没有什么关系,只有我们开始操作模型时,才会触及表操作,但是我们需要尽量保证模型和表之间的同步。
当执行以上的代码,控制台将会输出相应的 SQL 语句:
选择性删除 users 表
DROP TABLE IF EXISTS `users`;
建立 users 表
CREATE TABLE IF NOT EXISTS `users` (`id` INTEGER NOT NULL auto_increment , `firstName` VARCHAR(255), `lastName` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`))
显示 users 表索引
SHOW INDEX FROM `users`
之后在数据库将会新增一张 users 表,表结构如下:
id
firstName
lastName
createdAt
updatedAt
细心的你,可能会发现,在定义 User 模型时,我们只定义了 firstName 和 lastName 属性,但生成对应的表结构时,增加了 id、createdAt 和 updatedAt 3 个属性。其中 id 是整型,会自动增加,而 createdAt 和 updatedAt 用于跟踪记录的变更时间。如果你不需要 Sequelize 自动生成 createdAt 和 updatedAt 属性,你可以在创建 Sequelize 实例时,配置 define.timestamps 属性。
define: {
timestamps: false
}
上面的方式是全局的方式进行设置,当然我们也可以在定义模型时,进行单独设置,比如:
sequelize.define("user", {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
}, { 'timestamps': false });
此外 Sequelize 除了支持 STRING 类型之外,还支持 INTEGER、TEXT、DECIMAL 或 DATE 等类型,若需要了解完整的类型,请参考 Sequelize - DataTypes
。
单表增删改查
新增
方式一:调用 build 方法后对象只存在于内存中,需要进一步调用 save 方法才会保存到数据库中。
let user = UserModel.build({
firstName: "John",
lastName: "Doe"
});
user = await user.save();
console.log(user.get({'plain': true}));
以上代码运行后,终端将会输出以下信息:
Executing (default): INSERT INTO `users` (`id`,`firstName`,`lastName`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'John','Doe','2018-10-08 08:21:26','2018-10-08 08:21:26');
{ id: 5,
firstName: 'John',
lastName: 'Doe',
updatedAt: 2018-10-08T08:21:26.894Z,
createdAt: 2018-10-08T08:21:26.894Z
}
方式二:调用 create 方法后,会直接保存到数据库中。
const user = await UserModel.create({
firstName: "Sue",
lastName: "Smith"
});
console.log(user.get({'plain': true}));
以上代码运行后,终端将会输出以下信息:
Executing (default): INSERT INTO `users` (`id`,`firstName`,`lastName`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'Sue','Smith','2018-10-08 08:26:11','2018-10-08 08:26:11');
{ id: 6,
firstName: 'Sue',
lastName: 'Smith',
updatedAt: 2018-10-08T08:26:11.384Z,
createdAt: 2018-10-08T08:26:11.384Z
}
修改
方式一:直接操作对象属性,但需要调用 save 方法后才会保存。
user.firstName = "John";
user.lastName = "Hancock";
const updatedUser = await user.save();
console.log(updatedUser.get({'plain': true}));
以上代码运行后,终端将会输出相应的 SQL 语句:
UPDATE `users` SET `firstName`='John',`lastName`='Hancock',`updatedAt`='2018-10-08 08:32:06' WHERE `id` = 7
执行更新操作时, Sequelize
将自动更新 updatedAt
字段,非常方便。
方式二:调用 update 方法,实现数据更新。
const updatedUser = await user.update({
firstName: "John",
lastName: "Hancock"
});
console.log(updatedUser.get({'plain': true}));
以上代码运行后,终端将会输出相应的 SQL 语句:
UPDATE `users` SET `firstName`='John',`lastName`='Hancock',`updatedAt`='2018-10-08 08:37:23' WHERE `id` = 8
如果想限制更新的字段,可以通过以下方式:
// 方式一
user.firstName = "John";
user.lastName = "Hancock";
const updatedUser = await user.save({ fields: ['firstName'] });
// 方式二
const updatedUser = await user.update({
firstName: "John",
lastName: "Hancock"
}, {
fields: ['firstName']
});
console.log(updatedUser.get({'plain': true}));
删除
const user = await UserModel.create({ // 创建新的用户
firstName: "Sue",
lastName: "Smith"
});
console.log(user.get({'plain': true}));
await user.destroy(); // 删除刚创建的用户
以上代码运行后,终端将会输出以下信息:
Executing (default): INSERT INTO `users` (`id`,`firstName`,`lastName`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'Sue','Smith','2018-10-08 08:46:13','2018-10-08 08:46:13');
{ id: 9,
firstName: 'Sue',
lastName: 'Smith',
updatedAt: 2018-10-08T08:46:13.966Z,
createdAt: 2018-10-08T08:46:13.966Z
}
Executing (default): DELETE FROM `users` WHERE `id` = 9 LIMIT 1
其实如果我们启用了 paranoid
(偏执)模式, destroy
的时候不会执行 DELETE
语句,而是执行一个 UPDATE
语句将 deletedAt
字段设置为当前时间(一开始此字段值为 NULL
)。不过需要注意的是,仅当 timestamps=true
为 true 时,paranoid 模式才能生效。
当然我们也可以使用 user.destroy({force: true})
来强制删除,从而执行 DELETE
语句进行物理删除。
查询
查询全部
const users = yield User.findAll();
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName`, `lastName`, `createdAt`, `updatedAt` FROM `users` AS `user`;
限制字段
const users = await UserModel.findAll({
attributes: ['id', 'firstName', 'lastName']
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName`, `lastName` FROM `users` AS `user`;
字段重命名
const users = await UserModel.findAll({
attributes: ['id', 'firstName', ['lastName', 'lsName']]
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName`, `lastName` AS `lsName` FROM `users` AS `user`;
条件查询
Sequelize
的 where
配置项完美支持了 SQL
的 where
子句的功能,功能非常强大。下面我们来简单介绍一下:
基本条件
const users = await UserModel.findAll({
attributes: ['id', 'firstName'],
where: {
id: [1, 2],
firstName: 'John'
}
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName` FROM `users` AS `user` WHERE `user`.`id` IN (1, 2) AND `user`.`firstName` = 'John';
可以看到,键值对被转换成了 key = value
的形式,若一个对象包含多个键值对会被转换成了 AND
条件,即: k1: v1, k2: v2
转换为 k1 = v1 AND k2 = v2
。如果 value 的类型是数组类型,那么会转换成 IN 条件。
AND 条件
const Op = Sequelize.Op;
const users = await UserModel.findAll({
attributes: ['id', 'firstName'],
where: {
[Op.and]: [
{ id: [1, 2] },
{ firstName: 'John' }
]
}
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName` FROM `users` AS `user` WHERE (`user`.`id` IN (1, 2) AND `user`.`firstName` = 'John');
OR 条件
const Op = Sequelize.Op;
const users = await UserModel.findAll({
attributes: ['id', 'firstName'],
where: {
[Op.or]: [
{ id: [1, 2] },
{ firstName: 'John' }
]
}
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName` FROM `users` AS `user` WHERE (`user`.`id` IN (1, 2) OR `user`.`firstName` = 'John');
NOT 条件
const Op = Sequelize.Op;
const users = await UserModel.findAll({
attributes: ['id', 'firstName'],
where: {
[Op.not]: [
{ id: [1, 2] }
]
}
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName` FROM `users` AS `user` WHERE NOT (`user`.`id` IN (1, 2));
除了 and、or 和 not 操作符之外,Sequelize 还支持 notIn、like、notLike 和 between 等操作符,若想了解更多的操作符,你可以访问 Sequelize - querying
。
其它查询方法
查询单条记录
方式一:调用 findById 方法:
const user = await UserModel.findById(1);
console.log(user.get({'plain': true}));
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName`, `lastName`, `createdAt`, `updatedAt` FROM `users` AS `user` WHERE `user`.`id` = 1;
方式二:调用 findOne 方法:
const user = await UserModel.findOne({
where: { firstName: 'Sue' }
});
console.log(user.get({'plain': true}));
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName`, `lastName`, `createdAt`, `updatedAt` FROM `users` AS `user` WHERE `user`.`firstName` = 'Sue' LIMIT 1;
查询并获取数量
const result = await UserModel.findAndCountAll({
limit: 10,
offset: 0
});
console.log(result);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT count(*) AS `count` FROM `users` AS `user`;
SELECT `id`, `firstName`, `lastName`, `createdAt`, `updatedAt` FROM `users` AS `user` LIMIT 0, 10;
排序与分页
排序
const users = await UserModel.findAll({
attributes: ['id', 'firstName'],
order: [
['id', 'DESC']
]
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName` FROM `users` AS `user` ORDER BY `user`.`id` DESC;
分页
let countPerPage = 2, currentPage = 1;
const users = await UserModel.findAll({
attributes: ['id', 'firstName'],
limit: countPerPage, // 每页多少条
offset: countPerPage * (currentPage - 1) // 跳过多少条
});
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
SELECT `id`, `firstName` FROM `users` AS `user` LIMIT 0, 2;
批量操作
插入
const users = await UserModel.bulkCreate([
{ firstName: "John", lastName: "Doe"},
{ firstName: "Sue", lastName: "Smith"},
{ firstName: "John", lastName: "Hancock"}
]);
console.log(users);
以上代码运行后,终端将会输出相应的 SQL 语句:
INSERT INTO `users` (`id`,`firstName`,`lastName`,`createdAt`,`updatedAt`) VALUES (NULL,'John','Doe','2018-10-08 10:06:23','2018-10-08 10:06:23'),(NULL,'Sue','Smith','2018-10-08 10:06:23','2018-10-08 10
:06:23'),(NULL,'John','Hancock','2018-10-08 10:06:23','2018-10-08 10:06:23');
更新
const Op = Sequelize.Op;
const affectedRows = await UserModel.update(
{ firstName: "King" },
{
where: {
[Op.not]: { firstName: null }
}
}
);
console.log(affectedRows);
以上代码运行后,终端将会输出相应的 SQL 语句:
UPDATE `users` SET `firstName`='King',`updatedAt`='2018-10-08 10:11:15' WHERE NOT (`firstName` IS NULL)
上面返回的 affectedRows
其实是一个数组,里面只有一个元素,表示更新的数据条数。
删除
const affectedRows = await UserModel.destroy({
where: { firstName: 'King' }
});
console.log(affectedRows);
以上代码运行后,终端将会输出相应的 SQL 语句:
DELETE FROM `users` WHERE `firstName` = 'King'
sequelize多条件_Sequelize 快速入门相关推荐
- sequelize多条件_Sequelize 和 MySQL 对照
如果你觉得Sequelize的文档有点多.杂,不方便看,可以看看这篇. 在使用NodeJS来关系型操作数据库时,为了方便,通常都会选择一个合适的ORM(Object Relationship Mode ...
- sequelize多条件_Sequelize操作MySQL基本用法
Sequelize.js是一款针对nodejs的ORM框架. 使用nodejs连接过数据库的人肯定对数据库不陌生了.如果是直接链接,需要自己建立并管理连接,还需要手动编写sql语句.简单的项目到是无所 ...
- C++多线程快速入门(三):生产者消费者模型与条件变量使用
互斥锁完成 #include <iostream> #include <deque> #include <thread> #include <mutex> ...
- Java快速入门学习笔记4 | Java语言中的if条件语句
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- python海龟教程_Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环...
条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句.如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止.如果初始时,条件不成立,则循环 1 次也不会执行.Python 中 ...
- 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作
大数据技术之_20_Elasticsearch学习_01 一 概述 1.1 什么是搜索? 1.2 如果用数据库做搜索会怎么样? 1.3 什么是全文检索和 Lucene? 1.4 什么是 Elastic ...
- 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作...
一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 ...
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...
- Elastricsearch 索引操作详解(快速入门、索引管理、映射详解、索引别名)
一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...
最新文章
- Android图像变化
- 查看centos当前版本
- 2018/11/29 一个64位操作系统的设计与实现 03 (在Bochs上运行Boot程序)
- 基于node的登入例子(node-koa-mongoose)
- python多线程爬虫界面_Python实现贴吧多线程网盘爬虫
- 你还不会小程序啊?手把手带你做第一个和服务器交互的小程序
- 如何使用Java将字符串保存到文本文件?
- 坚持,对于一件事的坚持
- 树组件:主要配置项、属性、方法
- 并发编程学习之ForkJoinPool分支合并
- 分布式定时任务之3:elasticjob状态一直是分片待调整
- VSCode 中使用GO语言
- 基于Android 的手机传感器检测
- SQL AND OR 运算符的用法
- vue仿淘宝京东商品多条件筛选(vue实现)
- day12-HTML、CSS与blog页面讲解
- 2021年最后一期 | 转录组分析的正确姿势你了解了吗?
- 攻防世界——web新手题
- centos使用技巧
- Vue 设置路由title
热门文章
- Idea报错:@Override is not allowed when implementing interface method
- Python中的面向对象(类的实例化,面向对象的封装、继承与多态)
- MSI及MSIX详解
- 精选的10款Java开源项目,建议收藏
- “饮水机”形象比喻 教你什么是RAID
- 利用银行股的低估,买入高盛
- 莆田市计算机二级考试地点,莆田哪里有计算机二级考试班?
- MATLAB苹果的特征检测
- Powershell如何修改组策略(group policy)
- MATLAB R2023 for Mac v9.14.0 安装教程 数学分析软件