创建表时,使用错误的外键名称

时间:2016-12-05 18:25:40

标签: javascript mysql node.js express sequelize.js

我开始玩node express和Sequelize。我从他们的git页面跟随Sequelize/express的例子,但是当我执行de app时我遇到了问题。所有表都是正确创建的并且没有显示错误,但是当我查看表而不是创建名为secretariaid的外键来引用secretaria表时,它创建了一个名为secretarumid的字段,其中包含throws和error当试图使用数据库时。我有点混淆是错误:

  

使用sequelize model创建的模型和迁移:create。

oficina.js

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Oficina = sequelize.define('Oficina', {
    nombre_oficina: DataTypes.STRING,
    direccion: DataTypes.STRING,
    telefono: DataTypes.STRING,
    interno: DataTypes.STRING,
    email: DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        Oficina.belongsTo(models.Secretaria, {
          onDelete: "CASCADE",
          foreignKey: {
            allowNull: false
          }
        });
      }
    }
  });
  return Oficina;
};

secretaria.js

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Secretaria = sequelize.define('Secretaria', {
    nombre_secretaria: DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        Secretaria.hasMany(models.Oficina);
      }
    }
  });
  return Secretaria;
};

www.js上的sync()

models.sequelize.sync().then(function() {
  /**
   * Listen on provided port, on all network interfaces.
   */

  server.listen(port);
  server.on('error', onError);
  server.on('listening', onListening);
});

如果不是" Secretaria"它会接触名称是问题所在。我使用" Secre"它工作正常,但"秘密"或"秘密" +任何其他字母都没有复数表secretaria和外键最终" secretariumId"。  是"秘密+++++"某种保留字?

更新

"use strict";
module.exports = function(sequelize, DataTypes) {
  var Secretaria = sequelize.define("Secretaria",
  {
    nombre: DataTypes.STRING
  }, 
  {
    classMethods: {
      associate: function(models) {
        Secretaria.hasMany(models.Oficina)
      }
    },
    name: {
      singular: 'secretaria',
      plural: 'secretarias',
    },
    tableName: "secretarias"
  });

  return Secretaria;
};

使用选项名称可修复外键问题,tableName正在修复复数。现在一切正常。

1 个答案:

答案 0 :(得分:0)

这看起来是一个语言问题,我打赌基础表名称不正确,Sequelize默认使用复数。 Sequelize是英文版,使用inflection library来计算模型的单数/复数名称,如文档中的Naming Strategy所述。由于您看起来使用的是西班牙语,因此错误地复制了模型的名称。要解决此问题,您可以在模型定义中指定单数和复数名称的值,或使用英文名称:P

Sequelize.define()文档下查看options.name的详细信息。

您还可以通过设置false来选择是否希望数据库表名称为复数(默认/ true)或单数(freezeTableName: true/false,)。这个选项实际上是使用你用于第一个参数的 exact 值 - 它将保持大小写等等 - 但也有助于在你的情况下使它成为单数。

  var Secretaria = sequelize.define('Secretaria', {
    nombre_secretaria: DataTypes.STRING
  },
  name: {
    singular: 'secretaria',
    plural: 'secretarias',
  },
  freezeTableName: true, // table name is singular "Secreteria"