在nodejs(sequelize)中,通过迁移在MySql中添加新的键或列

问题描述 投票:0回答:1

在nodejs(sequelize)中,通过迁移在MySql中添加新的键或列,但它没有在模型中定义,那么它如何在模型中自动更新

我在添加新列时进行了新迁移,并且该列已成功添加,并且它也显示在数据库中。但是,在执行添加等任何操作时,它不会在该特定列中添加,因为该特定列不在模态中。

因此,在自动迁移时,模式应该更新。目前我必须手动将该键放入模态中

mysql node.js sequelize.js database-migration sequelize-cli
1个回答
0
投票

在 Sequelize 中,模型定义和数据库模式是不同的问题。当您创建迁移以向数据库添加新列时,迁移会更新架构,但模型定义保持不变。

为了确保在数据库中添加新列时模型自动更新,您可以使用

define
对象的
DataTypes
方法将新列动态添加到模型中。

以下是如何执行此操作的示例:

  1. 首先,使用新列创建一个新的迁移文件:
'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.addColumn('your_table_name', 'new_column', {
      type: Sequelize.STRING,
      allowNull: false,
      defaultValue: 'default_value',
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn('your_table_name', 'new_column');
  },
};
  1. 接下来,在模型文件中,使用
    define
    方法将新列动态添加到模型中:
const { Model, DataTypes } = require('sequelize');
const sequelize = require('./sequelize-instance');

class YourModel extends Model {}

YourModel.init(
  {
    // Existing model definition
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    // ...
  },
  {
    sequelize,
    modelName: 'YourModel',
    tableName: 'your_table_name',
    timestamps: true,
  }
);

// Dynamically add the new column to the model
YourModel.init(
  {
    newColumn: {
      type: DataTypes.STRING,
      allowNull: false,
      defaultValue: 'default_value',
    },
  },
  {
    sequelize,
    modelName: 'YourModel',
    tableName: 'your_table_name',
    timestamps: true,
  }
);

module.exports = YourModel;

在上面的示例中,我们为新列使用

DataTypes.STRING
类型,将其设置为
allowNull: false
,并提供
defaultValue
。您可以根据您的要求调整这些选项。

通过使用此方法,应用迁移时新列将自动添加到模型中,您可以在应用程序中使用新列,而无需手动更新模型。

请记住,如果数据库中有现有数据,则默认值将应用于所有现有行的新列。如果您需要以不同的方式处理此问题,您可能需要编写额外的迁移逻辑以使用适当的值填充新列。

© www.soinside.com 2019 - 2024. All rights reserved.