// ··· 这里Sequelize引入及数据库连接就不写了
let a = null
class User extends Model{}
if(!a) { // 这里是为了方便,简单判断下是否创建了数据表,实际开发中不会这么写的!
User.init({
firstName: DataTypes.STRING,
lastName: DataTypes.STRING
}, {sequelize, modelName: 'Users'})
User.sync({alter: true})
a = true
}
Sequelize 增删改查
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1kDN4MzMygTM0ITMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
简单的INSERT 查询:
看上边的例子。我们已经创建了一个users数据表,数据插入users表有2种方式:
(1) 方式一:
const user = User.build({ firstName: '吕', lastName: '星辰' })
user.save() // xxx.save() 方法是异步的,返回一个promise,如果你需要等保存完之后执行一些操作,可以加上then或 await来确保安全!
(2)方式二:(常用)
Sequelize提供了
create
方法,该方法将上述的
build
方法和
save
方法合并为一个方法:
await User.create({ firstName: '吕', lastName: '小辰' })
执行之后,数据将会被插入到数据表:
补充:
(1)以上2种方式保存之后,成功的回调参数是插入的数据:
// userID是主键,之所以是null因为主键是数据库层面帮我们自动生成的,这个返回的结果是
// 插入数据库之前 我们写的和sequelize帮我们生成的数据。
let use = User.create({
account: '321', password: '123', age: '21', test: '测试2'
}).then(res => {
console.log("返回结果:", res.toJSON())
})
/**
* 返回结果: {
createTime: 2021-04-16T05:07:49.634Z,
editTime: 2021-04-16T05:07:49.635Z,
uuid: 'bbf95af0-7e79-45b4-ab92-68d6f78f17d8',
userID: null,
account: '321',
password: '123',
age: '21',
test: '测试2'
}
*
*/
(2)上边输出之所以用toJSON() 方法,如果不做任何处理,此结果带有一些sequelize生成的额外的数据,下边是没做任何处理的结果:
简单的SELECT查询:
1、可以使用
findAll
方法从数据库中读取整个表:
User.findAll().then(users => {
console.log(users.every(user => user instanceof User)); // true
console.log('all users', JSON.stringify(users, null, 2))
})
SELECT查询特定属性:
1、特定属性查询
选择只查询某些特定属性的话,可以使用 attributes 参数:
User.findAll({
attributes: ['id']
}).then(users => {
console.log('all users id', JSON.stringify(users))
})
补充:
JSON.stringfy(value, [replacer], [space]) 将一个对象或值转化为JSON字符串
参数一:JSON字符串值;参数二:一个函数,如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;如果该参数为 null 或者未提供,则对象所有的属性都会被序列化;参数三:指定缩进用的空白字符串,用于美化输出(pretty-print);如果参数是个数字,它代表有多少的空格;上限为10。
如:
console.log(JSON.stringfy(r, null, 2))
2、重命名查询出来的属性
可以使用嵌套数组来重命名属性:
User.findAll({
attributes: [['lastName', 'aliasLastName'], 'age']
}).then(users => {
console.log('all users id', JSON.stringify(users))
})
3、总条数的查询
使用sequelize.fn 聚合函数,进行查询,使用聚合函数时,必须为它提供一个别名,以便能够从模型中访问它。
sequelize是链接数据库时返回的实例,也就是new Sequelize实例。
User.findAll({
attributes: [
'lastName',
[sequelize.fn('COUNT', sequelize.col('id')), 'allCount']
]
}).then(users => {
console.log('all users id', JSON.stringify(users))
})
4、排除某些属性 exclude: ['xxx']
User.findAll({
attributes: {
exclude: ['age', 'updatedAt', 'createdAt']
}
}).then(users => {
console.log('查询结果:', JSON.stringify(users))
})
WHERE 自句过滤查询:
where参数用于过滤查询
User.findAll({
where: {
id: 1,age: 21 // 查询id为1且age为21的数据
}
}).then(users => {
console.log('查询结果:', JSON.stringify(users))
})
具体复杂查询见文档:Sequelize文档
简单 UPDATE 查询 :
Update查询也接收where参数,就像上边的读取查询一样:
把id为1的数据中的age改为 50
User.update({age: 50}, {
where: {
id: 1
}
}).then(users => {
console.log('查询结果:', JSON.stringify(users))
})
批量创建:
Sequelize 提供了Model.bulkCreate方法,仅一次查询,可一次创建多条记录。
Model.bulkCreate 与 Model.create 非常相似,但是它接收的是一个数组对象:
User.bulkCreate([
{firstName: 'lxc'},
{firstName: 'xc'},
]).then(users => {
console.log('查询结果:', JSON.stringify(users))
})
注意:
使用Model.bulkCreate 创建表中没有的字段,会创建多条空记录:
User.bulkCreate([
{first: 'lxc'},
{first: 'xc'}
])
待续未完成。