postgresql打开连接并执行多个命令

时间:2015-05-10 20:52:08

标签: postgresql dart dart-async

我想使用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;
  }

1 个答案:

答案 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'))));