【问题标题】:How to use sequelize migration models when querying?查询时如何使用sequelize迁移模型?
【发布时间】:2019-05-31 16:39:19
【问题描述】:

我最近从“正常”续集切换到使用 sequelize-cli 迁移。到目前为止,使用 cli 效果很好。但我不确定如何使用生成的模型。特别是我这样做的方式似乎与协会有问题。它们是在数据库中正确创建的,但是在代码中我得到了Upvote is not associated to Video

之类的错误

我已经使用 cli 创建了模型并尝试导入和使用它们。

这是cli生成的video模型的sn-p:

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;
};

这里是迁移的 sn-p:

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) 函数吗?这似乎也很奇怪。

我在使用这些模型的方式上一定做错了,请让我知道该怎么做。

【问题讨论】:

  • 我曾尝试在 Postgresql 中使用 sequelize 迁移和关联模型。看看这个,github.com/praveenkumar-outlook/Sequelize-Postgres-Service
  • 噢,我明白了,你导入整个models 目录,其中包含一个index.js,所有关联都被调用!如果你用这个写一个答案,我会把它标记为接受。

标签: mysql node.js orm sequelize.js sequelize-cli


【解决方案1】:

Sequelize cli 将在models 目录中生成一个index.js,其中包含以下代码,

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 之间的关联可以定义为,

models/Video.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;
};

希望对你有帮助!!!

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2015-03-06
    • 2020-02-01
    • 2020-02-16
    • 2014-02-21
    • 2021-03-17
    • 2017-01-30
    • 2015-09-11
    • 2016-07-18
    相关资源
    最近更新 更多