如何使sequelize停止创建自动表(sequelize)



我发现sequelize是根据我的模型名称的定义自动创建表的。

我有以下代码:

const DataTypes = require("sequelize");
const sequelize = require("../mysql.js");
const Approver = sequelize.define("approver", {
subordinate_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: "user",
key: "id",
},
},
leader_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: "user",
key: "id",
},
},
main_leader_id: {
type: DataTypes.INTEGER,
allowNull: false,
references: {
model: "user",
key: "id",
},
},
});
const connect = async () => {
await Approver.sync();
};
connect();
module.exports = Approver;

每次我运行本地服务器,我在终端中得到以下消息:

CREATE TABLE IF NOT EXISTS `approvers` (`id` INTEGER NOT NULL auto_increment , `subordinate_id` INTEGER NOT NULL, `leader_id` INTEGER NOT NULL, `main_leader_id` INTEGER NOT NULL, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`subordinate_id`) REFERENCES `user` (`id`), FOREIGN KEY (`leader_id`) REFERENCES `user` (`id`), FOREIGN KEY (`main_leader_id`) REFERENCES `user` (`id`)) ENGINE=InnoDB;

,我发现表创建是从模型的定义生成的,因为我在模型中添加了其他名称,并且创建的表与我为代码命名的表相同。

我不知道为什么创建的表是复数"approvers"在模型中,我输入了"审批人"这个名字;显然,如果我试着用另一个名字,复数形式就不会像"approver"这个词那样出现。

最大的问题是我有迁移,当我运行它们时,表"批准";是在我的数据库中创建的,但是当我运行命令启动本地服务器时,sequelize会再创建一个表。最后我在数据库中得到了2个表,approver;的迁移和"批准者";

我已经试过把迁移和模型用复数名"approver";但是当我尝试使用模型时,这会导致一个错误,当我尝试创建或更新数据时,序列显示一个缺失字段错误,它说值&;updatedat&;缺少,这只会发生,因为自动生成的表创建了这个字段,但最有趣的事情是,表不是在我的Dbeaver中创建的,但sequelize显示了缺少字段的错误,甚至包含复数名称的模型和迁移也是…

我希望得到的结果是表不是用复数创建的

有人知道如何解决这个bug吗?输入图片描述

这里有两个问题:

  1. 根据模型定义自动创建表
  2. 自动创建表名时的复数形式

解决方案:

  1. 只需删除sync调用或下面的整个代码:
const connect = async () => {
await Approver.sync();
};
connect();

如果您使用迁移来创建整个结构并对其进行修改,则不要需要使用模型或Sequelize实例的sync方法

  1. 可以通过在模型的选项中指定'freezeTableName: true'来关闭表名的复数化(参见在官方文档中强制表名等于模型名)。

最新更新