我有3张 table 。
表情符号,EmojiPost,用户。
关于模式的有用信息如下:
EmojiPost.belongsTo(User, { foreignKey: 'user' });
EmojiPost.belongsTo(Emoji, {foreignKey: 'emoji_type'});
User.hasMany(EmojiPost, {foreignKey: 'user', onDelete: 'cascade'});
当我定义了这样的关联时,我可以执行以下操作将 EmojiPost 插入到数据库中:
var data = {
// some fields
user: 1,
emoji_type: 1
}
EmojiPost.create(data);
这很完美。但是,我希望外键不可为空,因此我将关联定义更改如下:
EmojiPost.belongsTo(User, { foreignKey: {field: 'user', allowNull: false} });
EmojiPost.belongsTo(Emoji, {foreignKey: {field: 'emoji_type', allowNull: false}});
User.hasMany(EmojiPost, {foreignKey: 'user', onDelete: 'cascade'});
之后,即使数据同时包含 emoji_type 和用户值,但我收到了它们两个的非空约束违规。
我还尝试了以下插入:
var emoji = await Emoji.findByPk(1);
var user = await User.findByPk(1);
var emoji_post = EmojiPost.build(data); // here data does not contain user and emoji_type
emoji_post.setEmoji(emoji);
emoji_post.setUser(user);
emoji_post.save();
这会引发未定义 setEmoji 和 setUser 函数的错误。我一整天都被困在这个问题上,非常感谢任何帮助。
最佳答案
回答我自己的问题。 Emoji 的主键是 emoji_id(因为我在定义中强调了:true)。尽管我在定义中指定了外键为 emoji_type,但 postgres 中实际表中列的名称是 emoji_type,但由于某些原因,sequelize 期望我将此值作为 emojiId 传递。如果我这样做,那么它可以工作,但我仍然不知道为什么它需要 emojiId。
关于javascript - 无法在 Sequelize 中插入具有不可为空外键的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60127106/