Sequelize CLIで新しい列を追加、削除する方法
SequelizeおよびSequelize CLIの使用を開始しました
開発時間なので、列の追加と削除が頻繁に行われます。既存のモデルに新しい列を追加する最良の方法は何ですか?
たとえば、新しい列 'completed' to Todo modelを作成します。この列をmodels/todo.jsに追加します。次のステップは何ですか?
sequelize db:migrate
を試しました
動作していません: "移行は実行されませんでした。データベースのスキーマはすでに更新されています。"
sequelize-cli を使用している場合は、最初に移行を作成する必要があります。これは、データベースに更新する方法と、何か問題が発生した場合に変更をロールバックする方法をエンジンに伝える単なるファイルです。このファイルは常にリポジトリにコミットする必要があります
$ sequelize migration:create --name name_of_your_migration
移行ファイルは次のようになります。
module.exports = {
up: function(queryInterface, Sequelize) {
// logic for transforming into the new state
return queryInterface.addColumn(
'Todo',
'completed',
Sequelize.BOOLEAN
);
},
down: function(queryInterface, Sequelize) {
// logic for reverting the changes
return queryInterface.removeColumn(
'Todo',
'completed'
);
}
}
そして、それを実行します:
$ sequelize db:migrate
同じテーブルに複数の列を追加する場合は、すべてをPromise.all()
でラップし、追加する列を配列内に配置します。
module.exports = {
up: (queryInterface, Sequelize) => {
return Promise.all([
queryInterface.addColumn(
'tableName',
'columnName1',
{
type: Sequelize.STRING
}
),
queryInterface.addColumn(
'tableName',
'columnName2',
{
type: Sequelize.STRING
}
),
]);
},
down: (queryInterface, Sequelize) => {
return Promise.all([
queryInterface.removeColumn('tableName', 'columnName1'),
queryInterface.removeColumn('tableName', 'columnName2')
]);
}
};
Sequelizeでサポートされている任意の列タイプを使用できます https://sequelize.readthedocs.io/en/2.0/api/datatypes/
Vscodeで作業している場合は、移行ファイルに型定義を追加できます。 QueryInterfaceおよびsequelizeが提供するすべてのメソッドを識別するのに役立ちます。
module.exports = {
/**
* @typedef {import('sequelize').Sequelize} Sequelize
* @typedef {import('sequelize').QueryInterface} QueryInterface
*/
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns
*/
up: function(queryInterface, Sequelize) {
// logic for transforming into the new state
return queryInterface.addColumn(
'Todo',
'completed',
Sequelize.BOOLEAN
);
},
down: function(queryInterface, Sequelize) {
// logic for reverting the changes
return queryInterface.removeColumn(
'Todo',
'completed'
);
}
}
PromiseをトランザクションにラップするというPterの提案に従って、async/awaitとトランザクションを使用したサンプルを以下に示します(インデックス作成時のバグ修正を含むドキュメントから)。
'use strict';
module.exports = {
async up(queryInterface, Sequelize) {
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.addColumn(
'Todo',
'completed',
{
type: Sequelize.STRING,
},
{ transaction }
);
await queryInterface.addIndex(
'Todo',
{
fields: ['completed'],
unique: true,
},
{ transaction }
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
async down(queryInterface, Sequelize) {
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn(
'Todo',
'completed',
{ transaction }
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
}
};