【发布时间】:2021-11-29 17:07:53
【问题描述】:
使用documentation 中的示例,仅在第一次插入时一切正常。在第二个和后续之后,就会出现错误。
const Product = this.sequelize.define('Product', {
title: Sequelize.STRING
});
const Tag = this.sequelize.define('Tag', {
name: Sequelize.STRING,
unique: true
});
const ProductTag = this.sequelize.define('ProductTag', {
product_id: Sequelize.INTEGER,
tag_id: Sequelize.INTEGER
});
Product.belongsToMany(Tag, {through: 'ProductTag', as: 'tag'});
Tag.belongsToMany(Product, {through: 'ProductTag'});
第一个插入工作正常。
Product.create({
title: 'Chair',
tag: [
{ name: 'Alpha'},
{ name: 'Beta'}
]
}, {
include: [{
model: Tag,
as: 'tag'
}]
})
SQL 日志
INSERT INTO "Product" ("id","title","created_at","updated_at") VALUES (DEFAULT,'Chair','2019-02-25 12:51:50.802 +00:00','2019-02-25 12:51:50.802 +00:00') RETURNING *;
INSERT INTO "Tag" ("id","name","created_at","updated_at") VALUES (DEFAULT,'Alpha','2019-02-25 12:51:51.061 +00:00','2019-02-25 12:51:51.061 +00:00') RETURNING *;
INSERT INTO "Tag" ("id","name","created_at","updated_at") VALUES (DEFAULT,'Beta','2019-02-25 12:51:51.061 +00:00','2019-02-25 12:51:51.061 +00:00') RETURNING *;
INSERT INTO "ProductTag" ("product_id","tag_id","created_at","updated_at") VALUES (1,1,'2019-02-25 12:51:51.068 +00:00','2019-02-25 12:51:51.068 +00:00') RETURNING *;
INSERT INTO "ProductTag" ("product_id","tag_id","created_at","updated_at") VALUES (1,2,'2019-02-25 12:51:51.072 +00:00','2019-02-25 12:51:51.072 +00:00') RETURNING *;
后续插入 Product.create(...) 产生错误 SequelizeUniqueConstraintError
Key "(name)=(Alpha)" already exists.
如何做到,如果标签已经存在,则获取现有标签的ID并忽略错误?
【问题讨论】:
-
您已将此问题标记为 [mysql] 和 [postgresql] - 您实际使用的是哪个 RDBMS?
-
你可能想看看upsert。
-
使用 [postgresql]
-
感谢@TGrif 的回答,但使用upsert,只添加了产品。未添加标签。
-
这是什么行为,因为在您的模型定义中,您的标签为
unique: true。这意味着在您的所有记录中,每个值只能有一个。
标签: node.js postgresql sequelize.js