2015-10-27 18 views
12

私のアプリは現在Sequelize sync()メソッドを使用してデータベースを作成しており、移行システムを使用するように変更したいと考えています。Sequelize移行の関連付け

私のモデルの1つにbelongsTo()のモデルがありますが、これらの関連付けの初期移行コードの作成方法はわかりません。

SQLクエリで外部キーを手動で作成する必要がありますか、またはいくつかの方法がありますか?

+0

移行を使用して初期データベース構造を作成するか、移行を使用して現在のデータベース構造を更新しますか? – ezpn

+0

最初のデータベース構造を最初に作成したい – loics2

答えて

11

ケース1:データベースの初期化

あなたの目的はそれだけで移行を使用してそれらを追加することなく手動のsync方法を使用することをお勧めしデータベース構造の初期化中に関係を追加する場合。モデルが適切に設計され、リレーションが定義されている場合は、syncメソッドの実行中に自動的に作成されます。

sequelize express exampleをご覧ください。タスクモデル

  • user.js - - 7行目から始まるユーザモデル
  • task.jsコンテンツを見て、 - 全てのモデル

  • task.jsが含ま

    • index.js:modelsディレクトリでは、3つのファイルを持っています次のコードは、ユーザーモデルとタスクモデルの間に関係を作成します。

      classMethods: { 
          associate: function(models) { 
          Task.belongsTo(models.User, { 
           onDelete: "CASCADE", 
           foreignKey: { 
           allowNull: false 
           } 
          }); 
          } 
      } 
      

      モデルファイルでリレーションを正しく準備すると、同期によって外部キーが作成されます。この場合、移行は必要ありません。

      エクスプレス例文readme.md全体を読んで、リポジトリファイルを参照して、それらの表現がどのように機能しているかを確認し、続行することをお勧めします。

      ケース2:あなたはすでにあなたが残しておきたいいくつかのデータを持っている場合は、データベース構造の移行

      データベースを再構築するための同期のための唯一の方法は、それを破壊することであるので、あなたは、移行スクリプトを使用する必要がありますすべてのデータと完全に並んでいます。

      migrations in the sequelize docsについて読むことができます。残念ながら、ドキュメントは関係の作成をカバーしません。次の関係を作成すると仮定しましょう。ユーザーはグループに属します。リレーションのユーザー側に列を作成するには、addColumnメソッドを使用します。

      queryInterface.addColumn(
          'user', 
          'group_id', 
          { 
          type: Sequelize.INTEGER, 
          allowNull: true 
          } 
      ) 
      

      は、残念ながらあなたのための外部キー制約を作成するには(まだ)素敵な機能がありませんが、あなたはそれが手動でsequelizeクエリメソッドを使用して行うことができます。 Postgresqlの例:

      queryInterface.sequelize.query("ALTER TABLE user 
          ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id) 
          REFERENCES group (id) MATCH SIMPLE 
          ON UPDATE CASCADE ON DELETE CASCADE;"); 
      

      編集:検索の多くの後、私は私がやりたいことを説明するブログ記事のカップルを見つけ

  • +0

    Hmm okありがとう。私はマイグレーションと同期の違いとそれらをいつ使うのかについてちょっと混乱していると思う。 Sync()のみを使用してモデルを更新した場合、データベースが正しく移行されますか? – loics2

    +2

    Syncは、現在のモデルに基づいてきれいなデータベース構造を作成します。 force属性がfalseに設定されている場合は、データベースが存在しない場合にのみ作成されます。それ以外の場合は、サーバーを再起動するたびにデータベース全体が消去されます。移行スクリプトは、既存の構造とデータを操作して既存のデータベースを変更するために使用されます。これは、更新の間にデータを保持したい運用環境で役に立ちます。 – ezpn

    +0

    質問はマイグレーション(本番環境で必要)に関するもので、この答えは答えられないため投票を停止してください。 (しかし、 'sync'のための良い答えです)。 – AJP

    2

    を追加しましたデータベース構造の移行ケース。

    明らかにそれを行う一般的な方法ではありませんが、それは私にとってもっと論理的です。マイグレーションのみを使用する場合は、SQL照会を使用して最初のマイグレーションを作成する必要があります。

    ここに投稿はthe first onethis oneからインスピレーションを受けています。

    しかし、とにかく、私はezrepoteinが最初のデータベースをsyncで作成してから移行するのが正しいと思います。 umzugを使用してマイグレーションのみを使用するよりも簡単です。

    +0

    私は最後の文まですべてに同意します。実動コードの移行が必要です。 – AJP

    +0

    マイグレーションを使用して本番環境でデータベースを初期化する可能性のあるユースケースについて詳しく説明できますか? – ezpn

    +1

    @ezrepotein syncはdbの作成には問題ありませんが、明らかに質問タイトルはより一般的な(したがって有用な) "Sequelize Migrationsの関連"で表現されています。私は実際には、あなたがあなたのテストのDBのためにもそれを行う場合、なぜ生産ではなく、マイグレーションを使用して好む。次に、dbの設定と更新で、 'no db、then db:sync、そうでなければdb:migrate'の代わりに、' sequelize db:migrate'のような同じ宣言的なコマンドを使用します。後者については、一般に認められているマイナーな好みがあると思います。 – AJP

    0

    あなたは、移行

    Exmapleへの参照を追加することができます。ちょうどあなたが参照しているモデルが存在することを確認してください

    user_id: { 
        type: Sequelize.BIGINT, 
        references: { 
         model: "users", 
         key: "id" 
        } 
    }, 
    

    0

    これを@ aryeh-armonの答えにコメントの代わりに(十分な担当者ではなく)回答として追加してください。これはモデル名ではなく、存在を確認するために必要なテーブル名です。つまり、モデルの名前がJobでdbテーブルの名前がJobsの場合、移行は代わりにこのようになります。

    jobId: { 
    type: Sequelize.INTEGER, 
    references: { 
        model: "Jobs", 
        key: "id" 
        } 
    }, 
    
    +0

    これは、aryeh armonの解答(私は同意する必要があります)にはっきりしていますが、私はまだ他のユーザーの答えにコメントするのに十分な担当者がいません。 – adamS

    関連する問題