node.js - Sequelize - 保存父母时设置孩子的外键
问题描述
我正在使用 Sequelize 5。当从数据库中获取父母时,当孩子不存在时,我无法将父母与孩子一起保存。
我的代码:
const parent: Parent = await Parent.schema(tenant).findByPk<Parent>(parentId, { include: relations });
parent.update({
medizinischeAngaben: 'This works',
hochbegabung: 'Also works'
});
parent.person.update({
name: 'This works'
});
if ( parent.child === null) {
const newChild: Child = await Child.schema(tenant).create({name: 'CHILD_NAME'});
parent.child = newChild;
parent.save();
}
parent.child.update({
name: 'Name from Frontend'
});
parent.save();
它将数据保存在 Parent 上(第 3 行和第 4 行)。当像 person 这样的子属性存在时,更新也有效 - 第 7 行。然后我得到了一个可能为 null 的子属性。我在if中检查它。我创造了一个新的孩子。它被保存到数据库中。然后我尝试关联到父级并保存父级。
我希望外键 id_child 设置在父级上,但它不会发生。
有趣的是:当我后来用前端的名字更新孩子的名字时,这也正确地保存到了数据库中。
如何正确保存父关联?
数据库是 PostgreSQL
解决方案
如果 Child 的主键是 auto_increment,Sequelize 不会从数据库中检索该值(在调试器中检查)。因此,该行parent.child = newChild;
实际上将外键设置为空。
您可以尝试options.returning : true
使用 create 语句 - 它仅适用于 Postgres,并且似乎它应该使您的代码正常工作。我使用 MySql,没有这样的选项,您必须在与父级关联之前选择新插入的行。
推荐阅读
- sql-server - 强制 Excel 使用 SQL 查询运行宏
- postgresql - psql:致命:“用户名”角色不可用
- sql - 外键在表中显示为 NULL。为什么?
- excel - 将 UserForm textbox.value 作为日期格式传输到工作表
- r - 通过动态选择名称来组合多个数据框
- rabbitmq - MassTransit/RabbitMQ 发送与发布和故障<> 问题
- r - 使用 purr:: 映射到带有列表列的 data_frame
- php - 使用 mikehaertl\php-pdftk 库来操作 PDF,首先调用 getDataFields 时链接命令失败
- excel - Excel VBA 上的日期过滤器
- python - 如何从 Python 循环创建 PySpark DataFrame