查询时如何使用sequelize迁移模型?

zzzyeukh  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(348)

我最近从“普通”sequelize切换到使用sequelize cli的迁移。到目前为止,使用cli的效果还不错。但我不确定如何使用生成的模型。尤其是我这样做的方式,我似乎与协会有问题。它们是在数据库中正确创建的,但是在代码中我得到了如下错误 Upvote is not associated to Video 我已经用cli创建了模型,并尝试导入和使用它们。
这是 video cli生成的模型:

module.exports = (sequelize, DataTypes) => {
    const Video = sequelize.define('Video', {
        userid: DataTypes.STRING,
        ...
    }, {});
    Video.associate = function(models) {
        Video.hasMany(models.Upvote, { foreignKey: 'videoid', sourceKey: 'id' });
    };
    return Video;
};

下面是迁移的一个片段:

let videos = function (queryInterface, Sequelize) {
    return queryInterface.createTable('Videos', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        },
        userid: {
            type: Sequelize.STRING,
            references: {
                model: 'Users',
                key: 'id'
            },
         },
         ...
     });
};

这是我导入模型的方式:

const Video = require('../models/video')(dbConnector.sequelize, Sequelize.DataTypes);

我觉得我要通过考试有点奇怪 sequelize 以及 DataTypes ,因为这在我自己构建模型时是不必要的。这是正确的进口方式吗?当我导入它们时没有错误,我可以像这样查询它们 Videos.findAll() 但是这种联系不起作用。我也不知道如何让他们工作,我需要打电话吗 Video.associate(models) 我自己工作?这看起来也很奇怪。
我使用这些模型的方式一定是做错了什么,请告诉我该怎么做。

ffscu2ro

ffscu2ro1#

sequelize cli将生成 index.js 内部 models 包含以下代码的目录,

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === 
      '.js');
  })
  .forEach(file => {
    const model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

在第一组代码中,它将导入所有模型,而在第二组代码中,它将根据内部配置的关联关联关联所有模型 associate 每个模型的方法。
例如,在你的例子中 Video 以及 Upvote 可以定义为,
模特/视频.js

module.exports = (sequelize, DataTypes) => {
    const Video = sequelize.define('Video', {
        id: DataTypes.STRING,
        ...
    }, {});
    Video.associate = function(models) {
        Video.hasMany(models.Upvote, {
            foreignKey: 'videoId',
            sourceKey: 'id'
        });
    };
    return Video;
};

模型/upvote.js

module.exports = (sequelize, DataTypes) => {
    const Upvote = sequelize.define('Upvote', {
        id: DataTypes.STRING,
        videoId: DataTypes.STRING
        ...
    }, {});
    Upvote.associate = function(models) {
        Upvote.belongsTo(models.Video, {
            foreignKey: 'videoId',
            targetKey: 'id'
        });
    };
    return Upvote;
};

希望这有帮助!!!

相关问题