【问题标题】:Sequelize wrong foreign key name when creating tables建表时sequelize错误的外键名
【发布时间】:2017-04-20 05:39:33
【问题描述】:

我开始使用 node express 和 Sequelize。我从他们的 git 页面遵循Sequelize/express 的示例,但是在执行 de app 时遇到了问题。所有的表都是正确创建的并且没有显示错误,但是当我查看表而不是创建一个名为 secretariaid 的外键来引用秘书表时,它创建了一个名为 secretarumid 的字段,尝试使用时抛出和错误数据库。
我有点困惑是错误:

使用 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 上的同步()

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

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

名字是问题的接缝,如果我使用“Secre”代替“Secretaria”,它可以正常工作,但是“Secret”或“Secret”+任何其他字母不会使表secretaria和外键结束向上“secretariumId”。 “Secret+++++”是某种保留字吗?

更新

"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 修复复数形式。现在一切正常。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答,该示例和定义文档的链接帮助我解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2018-01-05
    • 2021-12-24
    • 2014-11-09
    • 1970-01-01
    • 2015-04-17
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多