如何在使用 Sequelize 更改列或添加新列时更新迁移文件

Posted

技术标签:

【中文标题】如何在使用 Sequelize 更改列或添加新列时更新迁移文件【英文标题】:How to update migration files when change column or add new column using 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;
;

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

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 不需要手动编写一样?

【问题讨论】:

【参考方案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 函数中编写了这段代码,它就可以工作了

【讨论】:

以上是关于如何在使用 Sequelize 更改列或添加新列时更新迁移文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sequelize CLI 中添加、删除新列

如何在单个级别上添加新列时使用 pandas group-by?

Rails 4 在模型中添加新列或字段

在 VB 2010 的数据表中插入新列时,如何更新 SQL Server 2008 数据库?

为啥 Django 在添加新列时会删除 SQL DEFAULT 约束?

使用sql更改表的列的数据类型和添加新列和约束