Javascript 如何为Sequelize模型设置外键?
这是非常基本的,应该有效。。但事实并非如此。首先,我的模型:Javascript 如何为Sequelize模型设置外键?,javascript,node.js,postgresql,sequelize.js,Javascript,Node.js,Postgresql,Sequelize.js,这是非常基本的,应该有效。。但事实并非如此。首先,我的模型: const Conversation = sequelize.define('Conversation', { name: { type: DataTypes.STRING, allowNull: false }, ... }) Conversation.associate = (models, options) => { C
const Conversation = sequelize.define('Conversation', {
name: {
type: DataTypes.STRING,
allowNull: false
},
...
})
Conversation.associate = (models, options) => {
Conversation.hasOne(models.Audio, options)
}
以及:
我有一个模型加载器,它可以:
fs.readdirSync(`${__dirname}`)
.filter((modelFile) => {
return path.extname(modelFile) === '.js' && modelFile !== 'index.js'
})
.map((modelFile) => {
let model = sequelize.import(`./${modelFile}`)
models[model.name] = model
return model
})
.filter((model) => models[model.name].associate)
.forEach((model) => {
models[model.name].associate(models, {
hooks: true,
onDelete: 'CASCADE'
});
})
因此,它为定义了它的所有模型调用associate
方法。这样,当我.sync
它时,它会在我的对话
表中创建一个对话ID
字段
当我尝试执行时:
let updAudio = {
ConversationId,
name: 'myname'
}
await global.db.models.Audio.create(updAudio, { logging: console.log })
ConversationId
不为null,但当它保存在数据库中时,为null。我已经检查过一百次了。原始查询如下所示:
INSERT INTO "Audios" ("id","name","createdAt","updatedAt") VALUES (DEFAULT,'myname','2019-10-20 19:59:18.139 +00:00','2019-10-20 19:59:18.139 +00:00') RETURNING *;
那么,ConversationId发生了什么事?您可能需要在模型定义中添加外键: (其中一个可以工作) 或 您可能还需要通过以下方式定义您的
belongsTo
关联:
Audio.belongsTo(Conversation, foreignKey: 'conversationId');
尝试在创建表时查找生成的原始查询,然后从那里开始。似乎可行,但我认为将
belongsTo添加到
就足够了,如果您使用的是第三个,则无需编写前两个。因为第三个将自动添加外键字段
const Audio = sequelize.define("Audio", {
name: {
type: DataTypes.STRING,
unique: true,
allowNull: true
},
conversationId : {
type: Sequelize.INTEGER,
references: 'Conversations' // or "conversations"? This is a table name
referencesKey: 'id' // the PK column name
}
})
const Audio = sequelize.define("Audio", {
name: {
type: DataTypes.STRING,
unique: true,
allowNull: true
},
conversationId : {
type: Sequelize.INTEGER,
references: {
model: Conversation
key: 'id'
}
}
})
Audio.belongsTo(Conversation, foreignKey: 'conversationId');