Sequelize错误:传递给订单/组的未知结构:排序时为Literal



我正在使用Sequelize v6进行一个相当简单的Select and Order By查询,没有联接或任何操作。奇怪的是,无论我尝试什么方法,它第一次都有效,但第二次尝试时都失败了。我的意思是,我已经尝试了db.literal方法和普通的order: ['column', 'DESC']方法。

以下是它第一次工作时输出的内容:

Executing (default): SELECT "id", "timeStart", "timeEnd", "nextPage", "createdAt", "updatedAt" FROM "ScrapeJobs" AS "ScrapeJob" ORDER BY "ScrapeJob"."createdAt" DESC LIMIT 1;
21
const db = require('./connection.js');
const models = require('./models/index');
const ScrapeJob = models.ScrapeJob;
const app = express();
app.get('/snap', async function (req, res) {
await db.authenticate();
const q = db.literal('"ScrapeJob"."createdAt" DESC')
const p = ['createdAt', 'DESC']
let scrapeJobs = await ScrapeJob.findAll({
order: [q],
limit: 1
})
console.log(scrapeJobs)
return res.status(200).send('okay dokay')
})

所以这是第一次,每次都有效。但是,当我第二次尝试触发这个函数时(通过访问本地URL(,如果我使用db.literal方法,它会给我以下错误:

Error: Unknown structure passed to order / group: Literal { val: '"ScrapeJob"."createdAt" DESC' }

如果我使用简单的顺序数组:

Error: Unknown structure passed to order / group: Literal { val: ' DESC' }

我已经看到了GroupBy的相关问题和相关的破解方法,但我觉得这是一个简单得多的案例,可能有一个更简单的解决方案?我尝试过命名我的表和模式,但没有成功,但也许我做错了?以下是我的模型定义文件供参考,没有明确的表名或模式名:

'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class ScrapeJob extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
};
ScrapeJob.init({
timeStart: DataTypes.DATE,
timeEnd: DataTypes.DATE,
nextPage: DataTypes.INTEGER
}, {
sequelize,
modelName: 'ScrapeJob'
});
return ScrapeJob;
};

我也很乐意使用Sequelize的原始SQL解决方案,但它一直给我

SequelizeDatabaseError: relation "ScrapeJobs" does not exist

错误。我尝试过引用,而不是引用,在表名前面加上public.,但我似乎无法查询它。这是一个如此简单的问题,它让我头疼了好几个小时。在这一点上使用Sequelize真的是在猜测。有人能为我指明正确的方向吗?这意味着修复order子句还是仅仅修复我的原始SQL查询?提前谢谢。

我在从Sequelize 5.17.2升级到6.19.2时遇到了同样的错误。我在几个查询中得到了这个风格组:

group: [ [ models.Location, 'ClientId' ] ]

我找到了这个线索:https://github.com/sequelize/sequelize/issues/11421并遵循了关于用语句重写组的建议。我把上面的替换为:

group: [ 'Location.ClientId' ]

现在运行良好。可能会帮助别人。。。

半回答:

我的原始SQL查询不起作用的原因是我正在连接到生产数据库,该数据库尚未运行迁移。愚蠢的错误。我通过打印process.env.DB_HOST发现了这一点,我将其硬编码为生产数据库。

然而,即使在进行了迁移并连接到正确的数据库之后,我在进行查询时仍然会出现Error: Unknown structure passed to order / group: Literal { val: ' DESC' }错误:

let scrapeJobs = await ScrapeJob.findAll({
order: [['createdAt', 'DESC']],
limit: 1
})

我可以继续我的工作,我想只要我使用Sequelize,我就会继续使用原始SQL,但如果有人对剩余的错误有任何见解,我仍然会很感激。

最新更新