【问题标题】:How do I add a composite foreign key in sequelize?如何在 sequelize 中添加复合外键?
【发布时间】:2020-07-09 05:43:46
【问题描述】:

我已经定义了以下表格、存档和信息。每个文件可以有许多信息标签。字段和标签的组合是独一无二的。为此,我需要一个由字段和标签组成的复合主键。 field 是指归档表中的字段。模型定义如下。

存档表:

    module.exports = (sequelize, DataTypes) => {
      let archive = sequelize.define('archive', {
        fileid: {
          type: DataTypes.STRING,
          primaryKey: true,
          allowNull: false
        },
        filename: {
          type: DataTypes.STRING,
          unique: false,
          allowNull: false
        },
        originalname: {
          type: DataTypes.STRING,
          unique: false,
          allowNull: false
        },
        downloadlink: {
          type: DataTypes.STRING,
          unique: false,
          allowNull: false
        },
        domain: {
          type: DataTypes.STRING,
          unique: false,
          allowNull: false
        },
        sem: {
          type: DataTypes.INTEGER,
          unique: false,
          allowNull: false
        },
        branch: {
          type: DataTypes.STRING,
          unique: false,
          allowNull: false
        }
      });
      archive.associate = models => {
        models.archive.hasMany(models.info, {
          foreignKey: 'fileid'
        });
        models.archive.hasMany(models.upvotes, {
          foreignKey: 'fileid'
        });
      };
      return archive;
    };

信息表

    module.exports = (sequelize, DataTypes) => {
      let info = sequelize.define('info', {
        tag: {
          type: DataTypes.STRING,
          allowNull: false,
          primaryKey: true
        }
      });
      info.associate = models => {
        models.info.belongsTo(models.archive, {
          foreignKey: 'fileid',
          primaryKey: true
        });
      };
      return info;
    };

制作 primaryKey: true 不起作用。我已经尝试过了:也是。我似乎无法让它工作。

【问题讨论】:

    标签: node.js express sequelize.js


    【解决方案1】:

    续集可能是一个巨大的痛苦。我严格按照文档进行操作,但某些更复杂的查询仍然无法解决问题,例如composite primary key 的情况。我给你的建议是当你遇到Model fails 时,使用原始查询。话虽如此,仍然需要采取额外的措施来防止 SQL 注入攻击。

    这是一个例子:

    1. 确保包含type
    2. 清理变量(在本例中为 code
       db.sequelize
          .query('SELECT count(*) FROM logs WHERE code = :code ', {
             replacements: {
                code: code
             },
             type: Sequelize.QueryTypes.SELECT
          })
          .then((data) => {
            ...
          })
          .catch((err) => {
           ...
          });
    
    

    我会发表评论,但没有足够的空间。

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 2019-06-29
      • 1970-01-01
      • 2021-02-01
      • 2016-08-21
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      相关资源
      最近更新 更多