Как добавить составной внешний ключ в sequelize? - PullRequest
0 голосов
/ 28 марта 2020

Я определил следующие таблицы, архив и информацию. Каждый файл может иметь много информационных тегов. Сочетание поля и тега является уникальным. Для этого мне требуется составной первичный ключ, состоящий из поля и тега. Поле относится к полю в таблице архива. Определения модели приведены ниже.

Таблица архива:

    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 не работает. Я пробовал: также. Я не могу заставить его работать.

1 Ответ

0 голосов
/ 28 марта 2020

Sequelize может быть гигантской болью. Я следую документам к письму, и все же некоторые вещи не работают с некоторыми более сложными запросами, как, например, в случае composite primary key. Я предлагаю вам, когда вы набираете Model fails, go с необработанными запросами. Тем не менее, все же предпримите дополнительные шаги для защиты от 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) => {
       ...
      });

Я бы оставил этот комментарий, но не было достаточно места.

...