diff --git a/lib/migration.js b/lib/migration.js index 6acc67e..f0bc910 100644 --- a/lib/migration.js +++ b/lib/migration.js @@ -42,7 +42,7 @@ function mixinMigration(MySQL, mysql) { var table = self.tableEscaped(model); self.execute('SHOW FIELDS FROM ' + table, function(err, fields) { self.execute('SHOW INDEXES FROM ' + table, function(err, indexes) { - self.discoverForeignKeys(model, {}, function(discoverErr, foreignKeys) { + self.discoverForeignKeys(self.table(model), {}, function(discoverErr, foreignKeys) { if (!err && fields && fields.length) { self.alterTable(model, fields, indexes, foreignKeys, done); } else { @@ -95,7 +95,7 @@ function mixinMigration(MySQL, mysql) { var table = self.tableEscaped(model); self.execute('SHOW FIELDS FROM ' + table, function(err, fields) { self.execute('SHOW INDEXES FROM ' + table, function(err, indexes) { - self.discoverForeignKeys(model, {}, function(discoverErr, foreignKeys) { + self.discoverForeignKeys(self.table(model), {}, function(discoverErr, foreignKeys) { self.alterTable(model, fields, indexes, foreignKeys, function(err, needAlter) { if (err) { return done(err); @@ -339,7 +339,10 @@ function mixinMigration(MySQL, mysql) { var oldKeyNames = actualFks.map(function(oldKey) { return oldKey.fkName; }); newFkNames.filter(function(key) { return !~oldKeyNames.indexOf(key); }) .forEach(function(key) { - sql.push(self.buildForeignKeyDefinition(m, key)); + var constraint = self.buildForeignKeyDefinition(model, key); + if (constraint) { + sql.push('ADD ' + constraint); + } }); } @@ -412,12 +415,17 @@ function mixinMigration(MySQL, mysql) { }; MySQL.prototype.buildForeignKeyDefinition = function(model, keyName) { - var fk = model.settings.foreignKeys[keyName]; + //TODO validate that these are in the same DB, etc. + //TODO this is probably a better place to check this than in autoupdate or buildColumnDefinitions + var definition = this.getModelDefinition(model); + var fk = definition.settings.foreignKeys[keyName]; if (fk) { + var fkEntity = typeof fk.entity === "object" ? fk.entity : {name: fk.entity}; //this.getModelDefinition(fk.entity); + //TODO verify that the other model in the same DB - return ' ADD CONSTRAINT ' + this.client.escapeId(fk.name) + + return ' CONSTRAINT ' + this.client.escapeId(fk.name) + ' FOREIGN KEY (' + fk.foreignKey + ')' + - ' REFERENCES ' + this.tableEscaped(fk.entity.name) + + ' REFERENCES ' + this.tableEscaped(fkEntity.name) + '(' + this.client.escapeId(fk.entityKey) + ')'; } return ''; @@ -460,6 +468,14 @@ function mixinMigration(MySQL, mysql) { indexes.forEach(function(i) { sql.push(i); }); + +// var foreignKeys = definition.settings.foreignKeys || {}; +// for (var fk in foreignKeys) { +// var constraint = self.buildForeignKeyDefinition(model, fk); +// if (constraint) { +// sql.push(constraint); +// } +// } return sql.join(',\n '); };