2016-10-21 8 views
0
var state = require('./state') 
module.exports = function (sequelize, DataTypes) { 
    var city = sequelize.define('city', { 
     city_id : { 
      type : DataTypes.INTEGER, 
      autoIncrement : true, 
      primaryKey : true 
     }, 
     city_name : { 
      type : DataTypes.STRING, 
      allowNull : false, 
      unique : true 
     }, 
     city_state_id : { 
      type : DataTypes.INTEGER, 
      allowNull : false, 
      references : { 
       model : 'states', 
       key : 'state_id' 
      } 
     } 
    } 
    return city; 
} 

これは私の参照ファイルです。未処理拒否SequelizeDatabaseError:外部キー制約エラー:外部キーを追加できません

module.exports = function (sequelize, DataTypes) { 
    var state = sequelize.define('state', { 
     state_id: { 
      type: DataTypes.INTEGER, 
      autoIncrement: true, 
      primaryKey: true 
     }, 
     state_name: { 
      type: DataTypes.STRING, 
      allowNull: false, 
      unique: true 
     }, 
    }) 
    return state; 
} 

ここで私は外部キー制約を追加できないのですか?誰も私に助けてくれますか?

未処理の拒絶SequelizeDatabaseError:ER_CANNOT_ADD_FOREIGN:私は端末上migration.jsを実行しようとすると、外部キー制約 を追加することはできません:ノードmigration.js

migration.js:

私はこのようなエラーを取得しています
/*jslint node: true */ 
'use strict'; 
var Sequelize = require('sequelize'); 
var fs = require('fs'); 
var schema_dir = './schema/'; 
var config = require('./config').mysql_conf; 
var connection = new Sequelize(config.database, config.username, config.password, config); 
fs.readdir(schema_dir, function(err, files) { 
    if (err) { 
     console.log(err); 
    } else { 
     files = files.sort(); 
     console.log(files); 
     for (var i = 0; i < files.length; i++) { 
      var module_name = files[i].slice(0, -3); 
      console.log(schema_dir + files[i]); 
      // var schema = require(schema_dir + module_name); 
      try { 
       var model = connection['import']('' + schema_dir + module_name); 
       model.sync().then(function() { 
        console.log("table created: " + module_name); 
       }); 
       model.sync({force : true}) 
      } catch (ex) { 
       console.log("error with module_name: " + module_name, ex); 
      } 
     } 
    } 

}); 

これはなぜ起こっているのですか?

答えて

3

これが正しく動作することを確認するには、いくつかのことを理解/修正する必要があります。

同期()同期({力:真})対DROP TABLE IF EXISTSを実行するCREATE TABLE IF NOT EXISTSsync({force: true})に対し実行し、再度テーブルを作成します

sync()。したがって、この移行方法はではなく、ローカル/ devより上の環境ではで動作します。また、列を作成したり、データ型を変更したりする場合は、にはを使用して変更を適用できません。

ローカルでテストし、SHOW CREATE TABLEで移行ファイルを作成し、Sequelize migrationで実行します。

sync()同期の

非同期な性質は、皮肉なことに、各モデルが順番にロードされていることを保証するものではありません同期ループを意味非同期です。これは、異なるエラーログを出力し、あなたを捨てることができます。移行ファイルの

async.eachSeries(files, function(file, callback) { 
    var model = require(currentDir + '/' + file); 
    model 
     .sync({force: true}) 
     .then(function() { 
      console.log('Force-synced %s', file); 
      callback(); 
     }) 
     .catch(callback); 
}, function(err) { 
    if(err) throw err; 
    console.log('Completed migration in order as such %o', files); 
}); 

注文

あなたがcity.model.jsstate.model.jsのようなファイル名を持っている:あなたは、非同期のような非同期処理モジュールを使用する必要があります。 fs.readdirがアルファベット順にそれらを読み込みますので、それはまだ存在しないため、

city_state_id : { 
     type : DataTypes.INTEGER, 
     allowNull : false, 
     references : { 
      model : 'states', 
      key : 'state_id' 
     } 
    } 

はテーブルstatesに参照することはできません。

正しく注文する必要があります。一つの方法は、このような順序配列を作成することです:

var order = [ 
    'state', 
    'city' 
]; 

async.eachSeries(order, function(file, callback) { 
    var model = require(currentDir + '/' + file + '.model.js'); 
    model 
     .sync({force: true}) 
     .then(function() { 
      console.log('Force-synced %s', file); 
      callback(); 
     }) 
     .catch(callback); 
}, function(err) { 
    if(err) throw err; 
    console.log('Completed migration in order as such %o', files); 
}); 
あなたは、テストやサーバーを実行している場合、彼らは彼らの前にモデルにアクセスしようとし始めるかもしれモデルは

をロードするために待つことはありません

その他読み込まれます。 syncの非同期性は、モデルがロードされるのをサーバーが待つのを防ぎます。

解決策は、クエリの方法としてモデルを使用し、テーブルの構造を変更する方法ではありません。これは、ローカルでテストし、Sequelize migrationを使用して変更を加えるために使用する必要があります。

関連する問題