好的,我有,在我看来这是一个非常奇怪的问题。我有一个使用以下SQL创建的Postgres表:
CREATE TABLE message
(
message text,
author integer,
thread integer,
id serial NOT NULL,
"createdAt" timestamp with time zone,
"updatedAt" timestamp with time zone,
CONSTRAINT message_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE message
OWNER TO glenselle;
我使用Sails.js(使用Waterline ORM)将消息模型保存到数据库。请注意,在尝试隔离问题的过程中,每次尝试保存新记录时,我都会开始删除表,行为总是一样的。 ORM正在为我做一些关联,将作者与用户模型和线程与线程模型相关联。无论如何,当我试图保存记录时,我首先得到这个:
ERROR: duplicate key value violates unique constraint "message_pkey"
DETAIL: Key (id)=(1) already exists.
STATEMENT: INSERT INTO "message" ("message", "author", "thread", "id", "createdAt", "updatedAt") values ($1, $2, $3, $4, $5, $6) RETURNING *
所以这应该很容易理解。表中已经有一行id为1,这就是" message_pkey"约束被违反。但具有讽刺意味的是,没有数据!所以我的问题是,如果表中完全没有数据(它刚被删除并使用上面发布的SQL重新创建),可能会发生什么导致Postgres抛出一个唯一的约束违规?
这是我正在运行的创建模型的内容:
create: function(req, res) {
var self = this;
Thread.create({}, function(err, newThread) {
if(err) return console.log(err);
Message.create({message: req.body.conversation[0].message}, function(err, newMessage) {
if(err) return console.log(err);
// This returns an array of user ids
sails.controllers.thread.parseUserIds(req.body.participants, req.user, function(idList) {
// First, associate the message with the author
newMessage.author = req.user.id;
newMessage.save(function(err, savedMessage) {
if(err) return console.log(err);
// First, associate the participants with the thread
newThread.participants.add(idList);
// Next, associate the message with the thread
newThread.conversation.add(savedMessage);
newThread.save(function(err, savedThread) {
if(err) return console.log(err);
console.log('The thread looks to have been saved. Check it out!');
return res.json(savedThread);
});
});
});
});
});
},
答案 0 :(得分:0)
您正在尝试将模型实例传递给newThread.conversation.add
,这是“创建和添加”的快捷方式。要将现有实例添加到集合,您需要传递其ID。将行更改为:
newThread.conversation.add(savedMessage.id);
它应该有用。
其他几点:
sails.controllers.thread.parseUserIds
)文件夹中,而不是直接通过/api/services
访问控制器方法。服务由Sails自动全球化,可以从任何控制器访问。newThread.participants.add
,那么最终也会失败。您需要遍历数组并使用每个元素调用add
。 可能会在不久的将来添加对ID(以及传递现有实例对象)的支持,但我们不希望让花里胡哨的功能延迟基线关联支持的发布。进行这些调整,您的代码现在应该可以使用了!