Sequelize是什么?
Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。
Sequelize 遵从 语义版本控制。 支持 Node v10 及更高版本以便使用 ES6 功能。
如何是使用Sequelize连接数据库
在config文件中配置连接信息,sqlite会与其他有一些差别
// 连接pgsql
config.sequelize = {
dialect: 'postgres', // 连接的数据库mysql、postgres、sqlite、db2、mariadb和mssql
database: 'bs',
host: '10.10.3.32',
port: '5432',
username: 'bs',
password: '123456',
define: {
freezeTableName: false, // 如果freezeTableName为true,sequelize将不会尝试更改模型名称以获取表名称。否则,型号名称将为复数
underscored: false, // 在所有属性中添加下划线字段,包括用户定义的属性、时间戳和外键。不会影响具有显式设置字段选项的属性
},
};
// 连接sqlite
config.sequelize = {
host: 'localhost',
dialect: 'sqlite',
pool: {
max: 5, // 连接池中的最大连接数
min: 0, // 连接池中的最小连接数
acquire: 30000, // 该池在引发错误之前尝试获取连接的最长时间(以毫秒为单位)
idle: 10000, // 连接在释放之前可以处于空闲状态的最长时间(以毫秒为单位)
},
storage: './database.sqlite', // 仅供 sqlite 使用。默认为 ':memory:'
operatorsAliases: false, // 基于字符串的运算符别名。将对象传递给限制别名运算符集。
};
如何建立表描述
一般会在models文件下建立表描述,也就是每一个models和数据表关联的文件,这里的字段和数据库对应起来
'use strict';
var Sequelize = require('sequelize');
var {sequelize} = require('../sequelize.js');
var user = sequelize.define('user',{
id: {
type: Sequelize.BIGINT(20),
primaryKey: true,
allowNull: false,
unique: true,
autoIncrement: true
},
name: Sequelize.STRING(255), // 名字
age: Sequelize.BIGINT(11), // 年龄
sex: Sequelize.BIGINT(1), // 性别
create_time: Sequelize.DATE,
update_time: Sequelize.DATE
},{
timestamps: false, // 不要默认时间戳 数据库没有时间戳字段时,设置为false,否则报错 SequelizeDatabaseError: Unknown column 'createdAt' in 'field list'
freezeTableName: true
});
module.exports = user;
常用的方法:
- 增:create, build + save, bulkCreate
- 删:destroy
- 改:update,
- 查:findAll, findAndCountAll, findOne, findByPk, findOrCreate
详解常用方法
-
增
-
create
create
方法,将上述的 build 和 save 合并为一个方法。const res = await User.create({ name: "小徐" });
-
build + save
const xiaoxu = User.build({ name: “小徐” });
console.log(xiaoxu instanceof User); // true
console.log(xiaoxu.name); // “小徐”// build 方法仅创建一个对象,该对象表示可以映射到数据库的数据,并没有与数据库通信 await xiaoxu.save();// 使用 save 方法,将这个实例真正保存到数据库中。
-
bulkCreate
bulkCreate
批量创建,接收的参数为数组对象。const captains = await Captain.bulkCreate( [ { name: '小徐' }, { name: '小明' }] ); console.log(captains.length); // 2 console.log(captains\[0] instanceof Captain); // true console.log(captains\[0].name); // '小徐' console.log(captains\[0].id); // 1 // (或另一个自动生成的值)
默认情况下,
bulkCreate
不会在要创建的每个对象上进行验证,而 create 可以做到。
为了使bulkCreate
也运行这些验证,必须通过validata: true
参数,但这会降低性能。const Foo = sequelize.define('foo', { bar: { type: DataTypes.TEXT, validate: { len: [4, 6] } } }); // 这不会引发错误,两个实例都将被创建 await Foo.bulkCreate([ { name: 'abc123' }, { name: 'name too long' } ]); // 这将引发错误,不会创建任何内容,因为加上了 validdata: true,即会每一条都进行验证 await Foo.bulkCreate([ { name: 'abc123' }, { name: 'name too long' } ], { validate: true });
-
-
删
destory
await User.destory({ where:{ id: 1002 } }); -
改
update
await User.update({ age: 19}, { where:{ id: 1002 } }); -
查
-
findAll
查询所有
// 查询所有用户
const users = await User.findAll()
const users = await User.findAll({ where: { id: 2 } })// attributes 返回指定属性 const users = await User.findAll({ attributes: ['name', 'age'] }) // attributes + exclude 排除某些属性 const users = await User.findAll({ attributes: { exclude: ['age'] } }) // 使用嵌套数组进行重命名属性 const users = await User.findAll({ attributes: ['name', ['age','age2']] })
-
findByPk
findByPk
方法使用提供的主键从表中仅获得一个条目.
const res = await User.findByPk(123);if (res === null) { console.log('Not found!'); } else { console.log(res instanceof User); // true 它的主键是 123 }
-
findOne
findOne
方法获得它找到的第一个条目(它可以满足提供的可选查询参数).
const res = await User.findOne({ where: { id: ‘123’ } });if (res === null) { console.log('Not found!'); } else { console.log(res instanceof User); // true console.log(res.id); // '123' }
-
findOrCreate
找不到就创建。返回值是一个实例(找到的实例或创建的实例)和一个布尔值,true 即为创建。
const [user, created] = await User.findOrCreate({
where: { username: ‘小徐’ },
defaults: {
job: ‘Technical Lead JavaScript’
}
});console.log(user.username); // '小徐' console.log(user.job); // 这可能是也可能不是 'Technical Lead JavaScript' console.log(created); // 指示此实例是否刚刚创建的布尔值 if (created) { // created === true 即是创建 console.log(user.job); // 这里肯定是 'Technical Lead JavaScript' }
-
findAndCountAll
常用作处理与分页有关的查询,该方法是结合了 findAll 和 count 的便捷方法。(1)当没有提供 group 时, findAndCountAll 方法返回一个具有两个属性的对象:
count :一个整数(与查询匹配的记录总数)
rows :一个数组对象(获得的记录)
(2)当提供了 group 时, findAndCountAll 方法返回一个具有两个属性的对象:count - 一个数组对象(包含每组中的合计和预设属性)
rows - 一个数组对象(获得的记录)const { count, rows } = await User.findAndCountAll({ where: { title: { [Op.like]: 'foo%' } }, offset: 10, limit: 2 }); console.log(count); console.log(rows);
-