web-dev-qa-db-ja.com

Sequelize CLIで新しい列を追加、削除する方法

SequelizeおよびSequelize CLIの使用を開始しました

開発時間なので、列の追加と削除が頻繁に行われます。既存のモデルに新しい列を追加する最良の方法は何ですか?

たとえば、新しい列 'completed' to Todo modelを作成します。この列をmodels/todo.jsに追加します。次のステップは何ですか?

sequelize db:migrateを試しました

動作していません: "移行は実行されませんでした。データベースのスキーマはすでに更新されています。"

27
Gijo Varghese

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
50

同じテーブルに複数の列を追加する場合は、すべてを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/

15
thedanotto

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'
    );
  }
}

以下のようなインテリセンスを提供します sequelize intellisense

2
NS23

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;
        }
    }
};
0
Tim Newton