web-dev-qa-db-ja.com

Sequelizeの既存のモデルに列を追加する方法は?

このコマンドを使用してモデルと移行ファイルを追加しました

node_modules/.bin/sequelize model:generate --name User --attributes firstName:string,lastName:string,email:string

次に、性別や年齢などのフィールドをいくつか既存のテーブル(モデル)に追加したいと思います。モデルを手動で変更し、このコマンドを実行しました

node_modules/.bin/sequelize db:migrate

しかし、「マイグレーションは実行されず、データベーススキーマはすでに最新のものでした。」と回答しています。

ser.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define('User', {
    firstName: DataTypes.STRING,
    lastName: DataTypes.STRING,
    email: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    // associations can be defined here
  };
  return User;
};

前もって感謝します :)

8
Ajay Poriya

Suvethanの答え は正しいですが、移行コードスニペットには小さなバグがあります。 Sequelizeマイグレーションは、promiseが返されることを期待しています。これは、生成されたマイグレーションスケルトンのコメントに示されています。

Add altering commands here.
Return a promise to correctly handle asynchronicity.

Example:
return queryInterface.createTable('users', { id: Sequelize.INTEGER });

したがって、次の移行に進む前にすべてのプロミスが解決される保証がないため、プロミスの配列を返すと、予期しない結果が生じる可能性があります。ほとんどの操作は、Sequelizeがプロセスを閉じる前に完了するため、ほとんどの操作で問題が発生することはほとんどありません。しかし、データベースの移行に関しては、申し訳ありませんが安全である方が良いと思います。さまざまな約束を引き続き利用できます。あなたはそれをPromise.all呼び出し。

Suvethanの例ですが、Promise.all:

module.exports = {
  up: function (queryInterface, Sequelize) {
    return Promise.all([
      queryInterface.addColumn(
        'Users',
        'gender',
         Sequelize.STRING
       ),
      queryInterface.addColumn(
        'Users',
        'age',
        Sequelize.STRING
      )
    ]);
  },

  down: function (queryInterface, Sequelize) {
    // logic for reverting the changes
  }
};
6
David Blanchard

テーブルに新しいフィールドを追加するには、次のように移行スケルトンを使用する必要があります。

sequelize migration:create --name Users

移行ファイルを開き、以下のコードを追加します

module.exports = {
  up: function (queryInterface, Sequelize) {
    return [ queryInterface.addColumn(
              'Users',
              'gender',
               Sequelize.STRING
             ),
            queryInterface.addColumn(
             'Users',
             'age',
             Sequelize.STRING
          )];
  },

  down: function (queryInterface, Sequelize) {
    // logic for reverting the changes
  }
};

次に、移行を実行します

node_modules/.bin/sequelize db:migrate

:渡されたqueryInterfaceオブジェクトを使用して、データベースを変更できます。 Sequelizeオブジェクトは、STRINGやINTEGERなどの使用可能なデータ型を格納します。

クエリインターフェイスのメソッドの完全なリスト

これがお役に立てば幸いです。問題がある場合はお知らせください。

8
Suvethan Nantha

ちなみに私を助けた@Suvethan Nanthaの回答に加えて、クエリをPromise.allでラップするようにしてください。つまり、promiseを返すように**Promise.all**([queryInterface.addColumn(...)])を返します。エラーがスローされる場合があります。乾杯!

0
camelCase