javascript - Sequelize - 使用 MySQL 选择所有超过 5 分钟的记录的抽象查询

标签 javascript mysql node.js orm sequelize.js

我正在努力使用sequelize编写一个抽象查询,该查询将使用“updatedAt”列识别超过5分钟的记录。我的查询如下:

const Jts = await models.Jts.findOne({
    where: {
        publish: true,
        retry: {
            [Op.lte]: 3
        },
        updatedAt: {
            [Op.lte]: [sequelize.fn("(NOW() - INTERVAL 5 MINUTE)")]
        }
    },
    include: ["OrgSetEntries"],
    paranoid: false,
    order: [
        ["effectiveDate", "ASC"],
        ["updatedAt", "ASC"]
    ]
});

我尝试了一些语法,但很困难。生成的查询始终生成“无效日期”字符串,例如:

... updatedAt` <= 'Invalid date';

非常感谢任何建议。

最佳答案

您可以使用 Sequelize.literal("NOW() - (INTERVAL '5 MINUTE')") 来获取 5 分钟前更新的数据行。

例如

import { sequelize } from '../../db';
import Sequelize, { Model, DataTypes, Op } from 'sequelize';

class Jts extends Model {}
Jts.init(
  {
    publish: DataTypes.BOOLEAN,
    retry: DataTypes.INTEGER,
    updatedAt: DataTypes.DATE,
  },
  { sequelize, modelName: 'jts' },
);

(async function test() {
  try {
    // create tables
    await sequelize.sync({ force: true });
    // seed
    let date1 = new Date();
    date1.setHours(date1.getHours() - 1);
    await Jts.bulkCreate([
      { publish: false, retry: 2 },
      { publish: false, retry: 5 },
      { publish: true, retry: 2, updatedAt: date1 },
      { publish: true, retry: 1, updatedAt: new Date() },
    ]);
    // test
    const result = await Jts.findOne({
      where: {
        publish: true,
        retry: {
          [Op.lte]: 3,
        },
        updatedAt: {
          [Op.lte]: Sequelize.literal("NOW() - (INTERVAL '5 MINUTE')"),
        },
      },
      raw: true,
    });
    console.log('result:', result);
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

执行结果:

Executing (default): DROP TABLE IF EXISTS "jts" CASCADE;
Executing (default): DROP TABLE IF EXISTS "jts" CASCADE;
Executing (default): CREATE TABLE IF NOT EXISTS "jts" ("id"   SERIAL , "publish" BOOLEAN, "retry" INTEGER, "updatedAt" TIMESTAMP WITH TIME ZONE, PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'jts' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
Executing (default): INSERT INTO "jts" ("id","publish","retry","updatedAt") VALUES (DEFAULT,false,2,NULL),(DEFAULT,false,5,NULL),(DEFAULT,true,2,'2020-04-16 12:50:43.458 +00:00'),(DEFAULT,true,1,'2020-04-16 13:50:43.458 +00:00') RETURNING *;
Executing (default): SELECT "id", "publish", "retry", "updatedAt" FROM "jts" AS "jts" WHERE "jts"."publish" = true AND "jts"."retry" <= 3 AND "jts"."updatedAt" <= NOW() - (INTERVAL '5 MINUTE') LIMIT 1;
result: { id: 3,
  publish: true,
  retry: 2,
  updatedAt: 2020-04-16T12:50:43.458Z }

检查数据库:

node-sequelize-examples=# select * from "jts";
 id | publish | retry |         updatedAt
----+---------+-------+----------------------------
  1 | f       |     2 |
  2 | f       |     5 |
  3 | t       |     2 | 2020-04-16 12:50:43.458+00
  4 | t       |     1 | 2020-04-16 13:50:43.458+00
(4 rows)

我们想要获取id = 3一小时前更新的数据行。

关于javascript - Sequelize - 使用 MySQL 选择所有超过 5 分钟的记录的抽象查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61250827/

相关文章:

javascript - Puppeteer 为同一 URL 提供不同的页面 Headless 与 Headful

javascript - 如何在 NODE JS Express 中从 Controller 传递信息以查看

图像的 Javascript 圆 Angular

php - 在 onblur 函数中使用 PHP 和 Javascript

php - 将永久数据存储在 php 文件中以减少 SQL 查询的数量是一个好习惯吗?

java - 如何检查查询是否为空?

java - 尝试连接 docker mysql 时,ResourcePool 无法从其主要工厂或源错误获取资源

javascript - Mongoose 对象关系

node.js - 断开连接(1 次),因为使用 Karma-Jasmine 在 10000 毫秒内没有消息

javascript - 谷歌地图标记不接收点击事件