更新 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 和 typescript 进行自动迁移
Nodejs / PostgreSQL sequelize - 如何更新/更改数据库中的模型?