【问题标题】:How to update migration files when change column or add new column using Sequelize如何在使用 Sequelize 更改列或添加新列时更新迁移文件
【发布时间】:2015-12-18 04:24:21
【问题描述】:

我是 Sequelize 的新手,现在我正在使用 NodeJS 和 Sequelize 创建一个 RESTful api。我正在尝试弄清楚如何更改我的数据库架构,例如使用 Sequelize 更改我的列名

我创建一个这样的模型

sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text

它在模型中创建了一个文件

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Page = sequelize.define('Page', {
    name: DataTypes.STRING,
    text: DataTypes.TEXT,
    url: DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  });
  return Page;
};

迁移文件夹中的一个文件

'use strict';
module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.createTable('Pages', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      text: {
        type: Sequelize.TEXT
      },
      url: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.dropTable('Pages');
  }
};

问题是,如果我想添加新列并更改现有列名,该怎么办

示例我想改成这个

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Page = sequelize.define('Page', {
    fullname: DataTypes.STRING,
    text: DataTypes.TEXT,
    url: DataTypes.STRING,
    email: DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  });
  return Page;
};

我已经在 Stackoverflow 中阅读了一些关于此的页面,例如在此页面中

How to auto generate migrations with Sequelize CLI from Sequelize models?

Sequelize.js: how to use migrations and sync

其中一个页面有一种方法可以在此链接https://www.youtube.com/watch?v=wHTBxtk8ezo 中使用 Sequelize-cmd 自动更改列,但 Sequelize-cmd 已被弃用,另一种方式也是我现在唯一的方法是使用 sequelize migration:create 创建迁移文件并手动编写代码以使用addColumnrenameColumn 重命名和添加列

那么,我现在的问题是有没有一种方法可以使用 addColumnrenameColumn 自动创建迁移文件,就像 Sequelize-cmd 不需要手动编写一样?

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    导航到项目目录后,首先在终端中输入sequelize migration:create --name changeColumn。这会在您的迁移文件夹中创建一个名为 changeColumn 的新迁移文件,并在前面加上创建日期。 然后使用 renameColumn 方法,该方法接受表名、原始列名和新列名。将文件更新为以下代码后,返回终端并输入 sequelize db:migrate 以运行迁移。

    'use strict';
    
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.renameColumn('Users', 
      'beforeName', 'afterName');
     },
    
      down: (queryInterface, Sequelize) => {
        return queryInterface.renameColumn('Users', 'afterName', 'beforeName');
     }
    };
    

    【讨论】:

      【解决方案2】:

      有一个新的 npm 包可以通过比较你的模型文件并为你编写迁移文件来解决这个问题

      Sequelize-mig
      

      安装它:

      npm install sequelize-mig -g / yarn global add sequelize-mig
      

      然后像这样使用它

      sequelize-mig migration:make -n <migration name>
      

      它会自动为您生成迁移文件,其中包含从您的模型文件中读取的所有更新

      【讨论】:

        【解决方案3】:

        最简单的方法是

        queryInterface.renameColumn('tableName', 'oldName', 'newName');
        

        注意:我在 down 函数中尝试了这个,但没有工作,一旦我在 up 函数中编写了这段代码,它就可以工作了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-31
          • 2016-07-07
          • 1970-01-01
          • 2020-02-17
          • 2017-08-29
          • 2020-10-21
          • 1970-01-01
          相关资源
          最近更新 更多