更新 Sequelize 模型时,失败并返回与我提供的不同的表名?

Posted

技术标签:

【中文标题】更新 Sequelize 模型时,失败并返回与我提供的不同的表名?【英文标题】:When updating Sequelize model, fails and returns different table name than I provided? 【发布时间】:2019-05-25 09:25:29 【问题描述】:

我正在运行 PostgreSQL 11,并尝试使用 Sequelize 更新其表条目之一。

我的 NodeJS 代码:

require('env2')('.env');
const Sequelize = require('sequelize');

const sequelize=new Sequelize(process.env.database,process.env.username,process.env.password,
    dialect:'postgres'
);

const Agent=sequelize.define('agent');
updateValues=available:false;
Agent.update(updateValues,where:phonenumber:'+18005551212').then(result=>console.log(result));

agent具有以下结构:

id primary key serial,
phonenumber varchar(100),
available boolean

当我运行 NodeJS 代码时,我得到了这个错误:

Executing (default): UPDATE "agents" SET "updatedAt"='2018-12-27 10:16:54.504 +0
0:00' WHERE "phonenumber" = '+18005551212'
Unhandled rejection SequelizeDatabaseError: relation "agents" does not exist

为什么这次更新失败了?当我在sequelize.define(agent) 中将表名作为“代理”提供时,我不明白为什么错误是在谈论“代理”关系。

当我使用原始SQL时更新成功如下:

sequelize.query("update agent set available=false where phonenumber='+18005551212'").then(result=>
    console.log(result);
);

【问题讨论】:

【参考方案1】:

默认情况下,sequelize 会创建一个包含其定义名称复数的表,因此当您执行 sequelize.define('agent') 时,它实际上会创建一个名称为 agents 的表。如果你不想自然地改变你的表名,你可以在 sequelize 定义中使用freezeTableName: true 选项。更多可以在this答案中找到。参考Sequelize配置doc .

【讨论】:

这行得通,尽管调用 sequelize.define('agent',,freezeTableName:true,tableName: 'agent'); 我现在收到错误 column "updatedAt" of relation "agent" does not exist 是您自己创建了表还是您运行了生成和迁移命令?如果迁移未正确完成,可能会发生这种情况。更多可以在 Sequelize cli 文档中找到 我自己创建了表格。我没有运行任何生成和迁移命令。 updatedAt, createdAt 是在运行 sequelize generate 和 migration 时创建的附加列,此外它还会在当前数据库中创建一个存储元数据的附加表。现在您已经自己创建了表,它可能没有这些列,默认情况下它会尝试获取 orelse 更新。我建议您使用 generate 和 migrate 命令创建表,以便更顺畅地实施。

以上是关于更新 Sequelize 模型时,失败并返回与我提供的不同的表名?的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize with GraphQl:如何使用突变更新字段

Sequelize - 无法添加或更新子行:外键约束失败

使用 sequelize 和 typescript 进行自动迁移

Nodejs / PostgreSQL sequelize - 如何更新/更改数据库中的模型?

如何在使用 Sequelize 更改列或添加新列时更新迁移文件

在 sequelize 返回值中删除连接表数据