NodeJS Sequelize模型timestamps选项在MSSQL中生成多余列求助
解决Sequelize中timestamps选项被忽略的问题
嘿,我之前用Sequelize对接MSSQL的时候也碰到过一模一样的坑!你遇到的问题核心其实不在模型文件,而是在迁移文件上——Sequelize-cli的db:migrate命令是根据迁移文件来创建/修改表结构的,模型里的timestamps: false不会自动同步到迁移文件里。
下面是具体的排查和解决步骤:
1. 检查并修改对应的迁移文件
去你的项目根目录下的migrations文件夹,找到创建users表的那个迁移文件(文件名一般是[时间戳]-create-user.js)。你会发现文件里大概率还保留着createdAt和updatedAt的字段定义,就像这样:
module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.createTable('users', { user_ID: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, username: { type: Sequelize.STRING, allowNull: false }, password: { type: Sequelize.STRING, allowNull: false }, date_created: { type: Sequelize.DATE, allowNull: false }, // 就是这两行在搞事情! createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }); }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('users'); } };
把createdAt和updatedAt这两个字段的定义完全删掉,保存文件。
2. 重新执行迁移操作
先回滚之前的迁移(如果已经执行过):
npx sequelize-cli db:migrate:undo
然后再重新执行迁移:
npx sequelize-cli db:migrate
这时候去MSSQL里看users表,就不会再自动生成createdAt和updatedAt列了。
3. 后续生成模型的注意事项
以后用sequelize-cli生成模型的时候,记得加上--no-timestamps参数,这样迁移文件就不会默认添加时间戳字段了:
sequelize model:generate --name User --attributes userID:integer,username:string,password:string,dateCreated:date --no-timestamps
简单来说,模型文件主要是给Sequelize的ORM操作使用的,而数据库表结构的变更完全由迁移文件控制——这是很多新手容易混淆的点,我当初也踩过这个坑 😂
内容的提问来源于stack exchange,提问作者IAskQuestions
相关产品推荐
相关产品推荐

