Raw queries - 原始查询

由于常常使用简单的方式来执行原始/已经准备好的SQL查询,因此可以使用 sequelize.query 函数.

默认情况下,函数将返回两个参数 - 一个结果数组,以及一个包含元数据(受影响的行等)的对象. 请注意,由于这是一个原始查询,所以元数据(属性名称等)是具体的方言. 某些方言返回元数据 “within” 结果对象(作为数组上的属性). 但是,将永远返回两个参数,但对于MSSQL和MySQL,它将是对同一对象的两个引用.

  1. sequelize.query("UPDATE users SET y = 42 WHERE x = 12").then((results, metadata) => {
  2. // 结果将是一个空数组,元数据将包含受影响的行数.
  3. })

在不需要访问元数据的情况下,你可以传递一个查询类型来告诉后续如何格式化结果. 例如,对于一个简单的选择查询你可以做:

  1. sequelize.query("SELECT * FROM `users`", { type: sequelize.QueryTypes.SELECT})
  2. .then(users => {
  3. // 我们不需要在这里延伸,因为只有结果将返回给选择查询
  4. })

还有其他几种查询类型可用. 详细了解来源

第二种选择是模型. 如果传递模型,返回的数据将是该模型的实例.

  1. // Callee 是模型定义. 这样你就可以轻松地将查询映射到预定义的模型
  2. sequelize
  3. .query('SELECT * FROM projects', {
  4. model: Projects,
  5. mapToModel: true // 如果你有任何映射字段,则在此处传递true
  6. })
  7. .then(projects => {
  8. // 每个记录现在将是Project的一个实例
  9. })

查看 Query API 参考中的更多参数. 以下是一些例子:

  1. sequelize.query('SELECT 1', {
  2. // 用于记录查询的函数(或false)
  3. // 将调用发送到服务器的每个SQL查询.
  4. logging: console.log,
  5. // 如果plain为true,则sequelize将仅返回结果集的第一条记录.
  6. // 如果是false,它将返回所有记录.
  7. plain: false,
  8. // 如果你没有查询的模型定义,请将此项设置为true.
  9. raw: false,
  10. // 你正在执行的查询类型. 查询类型会影响结果在传回之前的格式.
  11. type: Sequelize.QueryTypes.SELECT
  12. })
  13. // 注意第二个参数为null!
  14. // 即使我们在这里声明了一个被调用对象,
  15. // raw: true 也会取代并返回一个原始对象.
  16. sequelize
  17. .query('SELECT * FROM projects', { raw: true })
  18. .then(projects => {
  19. console.log(projects)
  20. })