Sequelize 是一个 Node.js 中非常流行的 ORM(Object-Relational Mapping)框架,它可以很方便地让我们操作数据库。除了常用的 CRUD 操作之外,Sequelize 还支持执行原始 SQL 语句,这在某些场景下会非常有用。
Raw Query 的方法
Sequelize 提供了两种执行原始 SQL 语句的方式:query
和 queryInterface.query
。
query
方法
query
方法是直接通过 Sequelize 模型对象来调用的,它的用法如下:
Model.query(sql, { type: sequelize.QueryTypes.* })
其中,sql
是要执行的 SQL 语句,{ type: sequelize.QueryTypes.* }
是一个选项对象,其中的 type
属性指定了查询的类型,可以设置为以下四种:
sequelize.QueryTypes.SELECT
: 查询操作sequelize.QueryTypes.INSERT
: 插入操作sequelize.QueryTypes.UPDATE
: 更新操作sequelize.QueryTypes.DELETE
: 删除操作
比如,下面的代码展示了如何用 query
方法执行一个查询操作:
const sql = "SELECT * FROM users WHERE id = :id"; const result = await User.query(sql, { type: sequelize.QueryTypes.SELECT, replacements: { id: 1 } }); console.log(result);
上面的代码执行了一条查询语句,并将查询结果输出到控制台。
queryInterface.query
方法
queryInterface.query
方法则是通过 Sequelize 的 queryInterface
对象来调用的,它的用法如下:
sequelize.queryInterface.query(sql, { type: sequelize.QueryTypes.* })
其中,sequelize
是 Sequelize 实例对象,sql
和 { type: sequelize.QueryTypes.* }
的含义与 query
方法相同。
下面的代码展示了如何用 queryInterface.query
方法执行一个更新操作:
const sql = "UPDATE users SET name = :name WHERE id = :id"; const result = await sequelize.queryInterface.query(sql, { type: sequelize.QueryTypes.UPDATE, replacements: { id: 1, name: '张三' } }); console.log(result);
上面的代码执行了一条更新语句,并输出了更新结果。
应用场景
虽然 Sequelize 提供了很多便利的 ORM 操作,但在某些情况下还是需要使用原生 SQL 来完成业务需求。下面列举了几个应用场景:
复杂查询
当需要进行复杂的查询时,ORM 操作可能无法完全满足业务需求。这时,使用原生 SQL 就是一个好的选择。
比如,下面的代码展示了如何通过原生 SQL 来查询出年龄大于 18 岁的用户及其关注的人数:
const sql = "SELECT u.*, (SELECT COUNT(*) FROM follows WHERE followed_id = u.id) AS followed_count FROM users u WHERE u.age > :age"; const result = await User.query(sql, { type: sequelize.QueryTypes.SELECT, replacements: { age: 18 } }); console.log(result);
上面的代码使用了子查询来计算每个用户的关注人数,并将查询结果输出到控制台。
批量更新
当需要对数据进行批量更新时,ORM 操作可能会很慢,而原生 SQL 执行起来会更加高效。
比如,下面的代码展示了如何通过原生 SQL 来修改所有未读消息的状态:
const sql = "UPDATE messages SET is_read = TRUE WHERE is_read = FALSE"; const result = await sequelize.queryInterface.query(sql, { type: sequelize.QueryTypes.UPDATE }); console.log(result);
上面的代码执行了一条更新语句,将所有未读消息的状态修改为已读,并输出了更新结果。
总结
本文介绍了 Sequelize 执行原生 SQL 语句的两种方式,以及一些应用场景。在实际开发中,需要根据具体需求来选择使用 ORM 操作还是原生 SQL。当然,也可以结合使用两种方法,以达到更好的效果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c0eedd83d39b4881549c3d