查询时如何使用sequelize迁移模型?
How to use sequelize migration models when querying?
我最近从 "normal" sequelize 切换到使用 sequelize-cli 的迁移。到目前为止,使用 cli 工作正常。但我不确定如何使用生成的模型。特别是,我这样做的方式似乎与协会有问题。它们已在数据库中正确创建,但在代码中出现 Upvote is not associated to Video
之类的错误
我已经使用 cli 创建了模型并尝试导入和使用它们。
这是由 cli 生成的 video
模型的片段:
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)
函数吗?这看起来也很奇怪。
我一定是在使用这些模型的方式上做错了,请让我知道如何做不同的事情。
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;
};
models/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;
};
希望对您有所帮助!!!
我最近从 "normal" sequelize 切换到使用 sequelize-cli 的迁移。到目前为止,使用 cli 工作正常。但我不确定如何使用生成的模型。特别是,我这样做的方式似乎与协会有问题。它们已在数据库中正确创建,但在代码中出现 Upvote is not associated to Video
我已经使用 cli 创建了模型并尝试导入和使用它们。
这是由 cli 生成的 video
模型的片段:
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)
函数吗?这看起来也很奇怪。
我一定是在使用这些模型的方式上做错了,请让我知道如何做不同的事情。
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;
};
models/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;
};
希望对您有所帮助!!!