Получить данные из RethinkDB - PullRequest
0 голосов
/ 16 мая 2018

В книге «Разработка масштабируемых приложений Dart» есть пример использования RethinkDB

  class UserStore{
      final List<User> users = new List();
      User user;
      Rethinkdb rdb = new Rethinkdb();
      Connection conn;

  // opening a connection to the database:
  openAndStore() {
    rdb.connect(db: "test", port:9090, host: "127.0.0.1").
    then((_conn) {
      conn = _conn;
      storeData(conn);
    }).catchError(print);
  }



  storeData(conn) {
    List jobsMap = new List();
    for (user in users) {
      var jobMap = user.toMap();
      jobsMap.add(jobMap);
    }
// storing data:
    rdb.table("users").insert(jobsMap).run(conn)
        .then((response)=>print('documents inserted'))
        .catchError(print);
// close the database connection:
    close();
  }


  openAndRead() {
    rdb.connect(db: "test", port:9090, host: "127.0.0.1").then((_conn) {
      conn = _conn;
      readData(conn);
    }).catchError(print);
  }
// reading documents:
  readData(conn) {
    print("test3");
    rdb.table("users").getAll("1,2,3").run(conn).then((results) {
      processJob(results);
      close();
    });
  }


// working with document data:

  processJob(results) {
    for (var row in results) {
// Refer to columns by nam:
      print('${row.id}');
      }
      }
  close() {
    conn.close();
  }

Но на практике эта процедура не приводит к смерти.Хотя он называется openAndRead ().

catchError не работает.Какой самый простой способ работы с моделями и RethinkDB?

1 Ответ

0 голосов
/ 17 мая 2018

Я не уверен, что полностью понимаю вопрос, но я бы предложил использовать синтаксис Dart async/await, так как это облегчает чтение кода.

Например

main() async {
  Rethinkdb rdb = new Rethinkdb();
  try {
    // get the connection
    Connection conn = await rdb.connect(port: 28015);

    // insert a row into the users table
    await rdb.table('users').insert({'a': 'b'}).run(conn);

    // query the users table
    Cursor c = await rdb.table('users').run(conn);

    // grab all the data from the cursor
    List rows = await c.toList();

    print(rows);

    // close the connection
    conn.close();
  } catch (e) {
    print('catching exception $e');
  }
}

Вы можете создать класс для хранения соединения с базой данных, чтобы вам не нужно было его открывать и закрывать.

class Database {
  Rethinkdb _rdb = new Rethinkdb();
  Connection _conn;

  connect(int port) async {
    _conn = await _rdb.connect(port: port);
  }

  Future<List> fetch() async {
    Cursor c = await _rdb.table('users').run(_conn);
    return await c.toList();
  }

  close() {
    _conn.close();
  }
}

Кроме того, обработка ошибок драйвера может быть нарушена. Драйвер выдает ошибку, когда он, вероятно, должен завершить Future с ошибкой, здесь:

}).catchError((err) => throw new RqlDriverError(
    "Could not connect to $_host:$_port.  Error $err"));
return _completer.future;

Это может стоить вопроса разработчикам пакетов. Вы заметите, что в моем main () выше исключение не перехватывается.

...