web-dev-qa-db-ja.com

SequelizeモデルからSequelize CLIを使用して移行を自動生成する方法は?

Sequelizeモデルのセットがあります。 DB Syncではなく、移行を使用したい。

Sequelize CLI は、これを行うことができるようです この記事 :「 」

既存のSequelizeモデルからSequelize CLIを使用して移行を自動生成する方法は?

48
Michael Schmidt

既存のモデルの移行スクリプトを作成することはできません。

リソース:

従来の方法を使用する場合は、CLIを使用してモデルを再作成する必要があります。

sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text

これらのファイルが生成されます:

models/myuser.js:

"use strict";
module.exports = function(sequelize, DataTypes) {
  var MyUser = sequelize.define("MyUser", {
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    bio: DataTypes.TEXT
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  });
  return MyUser;
};

migrations/20150210104840-create-my-user.js:

"use strict";
module.exports = {
  up: function(migration, DataTypes, done) {
    migration.createTable("MyUsers", {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER
      },
      first_name: {
        type: DataTypes.STRING
      },
      last_name: {
        type: DataTypes.STRING
      },
      bio: {
        type: DataTypes.TEXT
      },
      createdAt: {
        allowNull: false,
        type: DataTypes.DATE
      },
      updatedAt: {
        allowNull: false,
        type: DataTypes.DATE
      }
    }).done(done);
  },
  down: function(migration, DataTypes, done) {
    migration.dropTable("MyUsers").done(done);
  }
};
27
Dor Rotman

モデルをゼロから再作成したくない場合は、次のCLIコマンドを使用して移行ファイルを手動で生成できます。

sequelize migration:generate --name [name_of_your_migration]

これにより、空のスケルトン移行ファイルが生成されます。モデル構造をファイルにコピーするわけではありませんが、すべてを再生成するよりも簡単でわかりやすいと思います。注:必ず、移行ディレクトリの格納ディレクトリからコマンドを実行してください。そうでない場合、CLIは新しい移行ディレクトリを生成します

21
john_mc

Npmパッケージsequelize-auto-migrationsを使用して、移行ファイルを自動的に生成できるようになりました。 https://www.npmjs.com/package/sequelize-auto-migrations

Sequelize-cliを使用して、プロジェクトを初期化します

sequelize init

モデルを作成し、モデルフォルダーに配置します。

Sequelize-auto-migrationsをインストールします。

npm install sequelize-auto-migrations

で初期移行ファイルを作成します

node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>

移行を実行します。

node ./node_modules/sequelize-auto-migrations/bin/runmigration

既存のデータベースからモデルを自動的に生成することもできますが、それは問題の範囲を超えています。

17
Kallaste

小さな作業用の「移行ファイルジェネレータ」を作成しました。 sequelize db:migrateを使用して、完全に正常に機能するファイルを作成します-外部キーを使用しても!

ここで見つけることができます: https://Gist.github.com/manuelbieh/ae3b028286db10770c81

以下をカバーする12の異なるモデルを持つアプリケーションでテストしました。

  • DataTypeとしてのSTRING、TEXT、ENUM、INTEGER、BOOLEAN、FLOAT

  • 外部キーの制約(相互(ユーザーに所属するチーム、所有者として所属するチーム)も)

  • namemethod、およびuniqueプロパティを持つインデックス

5
Manuel Bieh

自動生成はされませんが、モデルの変更時に新しい移行を生成する1つの方法は次のとおりです(移行とモデルが同じレベルにあるストックsequelize-cliファイル構造を使用していると仮定します)。

  1. (Manuel Biehの提案と同じですが、インポートの代わりにrequireを使用します)移行ファイル(ない場合は、「sequelize migration:create」を実行して生成できます)には次のコードがあります。

    'use strict';
    var models = require("../models/index.js")
    module.exports = {
      up: function(queryInterface, Sequelize) {
        return queryInterface.createTable(models.User.tableName, 
          models.User.attributes);
      },
      down: function(queryInterface, Sequelize) {
        return queryInterface.dropTable('Users');
      }
    };
    
  2. ユーザーモデルに変更を加えます。

  3. データベースからテーブルを削除します。
  4. すべての移行を元に戻します:sequelize db:migrate:undo:all
  5. 変更をデータベースに保存するために再移行します。 sequelize db:migrate
4
T Ratnayake

私は最近、うまくいくと思われる次のアプローチを試しましたが、副作用があるかどうかは100%わかりません:

'use strict';

import * as models from "../../models";

module.exports = {

  up: function (queryInterface, Sequelize) {

    return queryInterface.createTable(models.Role.tableName, models.Role.attributes)
    .then(() => queryInterface.createTable(models.Team.tableName, models.Team.attributes))
    .then(() => queryInterface.createTable(models.User.tableName, models.User.attributes))

  },

  down: function (queryInterface, Sequelize) {
    ...
  }

};

sequelize db:migrateを使用して上記の移行を実行すると、コンソールに次のように表示されます。

Starting 'db:migrate'...
Finished 'db:migrate' after 91 ms
== 20160113121833-create-tables: migrating =======
== 20160113121833-create-tables: migrated (0.518s)

すべてのテーブルがそこにあり、すべてが(少なくともそうであるように)期待どおりに動作します。正しく定義されていれば、すべての関連付けも存在します。

0
Manuel Bieh