如何在使用 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
创建迁移文件并手动编写代码以使用addColumn
和renameColumn
重命名和添加列
那么,我现在的问题是有没有一种方法可以使用 addColumn
和 renameColumn
自动创建迁移文件,就像 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 更改列或添加新列时更新迁移文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个级别上添加新列时使用 pandas group-by?
在 VB 2010 的数据表中插入新列时,如何更新 SQL Server 2008 数据库?