我想使用dart的postgresql驱动程序执行以下两个插入操作。 以下代码有效!
INSERT INTO posts(
title, description, posted_at, last_edited, "user",
editor, up_votes, down_votes, flag, links_to)
VALUES ('test title', 'test description', now(), now(), 'dartUser', 'dartUser',
0, 0, 'healthy', 'http://google.com');
INSERT INTO atatched_tags(
post_id, tag)
VALUES (currval('posts_post_id_seq'), 'testTag');
只有在为dart方法指定了可选参数时才应执行第二次插入。 我现在的代码看起来像这样。
addPost(Map post_values, [Map tag_values]){
Connection conn;
connect(uri)
.then((_conn){
conn = _conn;
})
.then((_){
conn.execute('''insert into posts(title, description, posted_at, last_edited, "user", editor, up_votes, down_votes, flag, links_to)
values(@title, @description, now(), now(), @user, @editor, @upVotes, @downVotes, @flag, @links_to)''', post_values)
.catchError((err){
print('Execute error in addPost: $err');
})
.then((_){
if(tag_values != null){
_addTagToPost(conn, tag_values);
}
})
.whenComplete(() => conn.close());
})
.catchError((err) => print('Error in addPost: $err'));
}
_addTagToPost(Connection conn, Map values) {
print('trying to add tag to attached tags');
conn.execute("insert into atatched_tags values(currval('posts_post_id_seq'), @tag)", values)
.catchError((err){
print('Execute error in addTagToPost: $err');
});
}
我按如下方式运行方法。
dbUtil.addPost({'title': 'Sample title',
'description': 'This is a description for a sample post',
'user': 'dartUser', 'editor': 'dartUser', 'upVotes': 0,
'downVotes': 0, 'flag': 'healthy', 'links_to':
'http://google.com'}, {'tag':'testTag'});
dbUtil
是上面两种方法所在的类的实例。
代码不会抛出任何错误。但即使它写入控制台trying to add tag to attached tags
,也不会执行第二次插入操作(表中没有添加任何行)。第一个按预期工作。
非常感谢任何帮助。
编辑:如果有人想在_addTagToPost
函数中添加多个标签,那么这段代码可能会有所帮助。
编辑2:下面的代码不正确我离开了,但检查了接受的答案中的评论。
Future _addTagToPost(Connection conn, List<Map> values) {
var completer = new Completer();
values.forEach((value){
conn.execute("insert into attached_tags values(currval('posts_post_id_seq'), @tag)", value)
.catchError((err){
print('Execute error in addTagToPost: $err');
});
});
return completer.future;
}
答案 0 :(得分:1)
您需要在此处添加return
return _addTagToPost(conn, tag_values);
和
Future _addTagToPost(Connection conn, Map values) {
print('trying to add tag to attached tags');
return conn.execute(
"insert into atatched_tags values(currval('posts_post_id_seq'),
@tag)", values)
.catchError((err){
print('Execute error in addTagToPost: $err');
});
}
保持异步操作连接。否则,在_addTagToPost()
完成之前关闭连接会导致无法完成此SQL语句。
更新问题中的编辑内容。这也可以像
那样完成Future _addTagToPost(Connection conn, List<Map> values) {
return Future.wait(values.map((value){
return conn.execute("insert into attached_tags values(currval('posts_post_id_seq'), @tag)", value)
.catchError((err){
print('Execute error in addTagToPost: $err');
});
}));
}
或
Future _addTagToPost(Connection conn, List<Map> values) =>
Future.wait(values.map((value) => conn
.execute(
"insert into attached_tags values(currval('posts_post_id_seq'), @tag)",
value)
.catchError((err) => print('Execute error in addTagToPost: $err'))));