В RethinkDB, что является самым простым способом проверить, существует ли база данных или таблица?

Как я знаю, я могу сделать это, указав через dbList() и tableList(), а затем ищем то, что я хочу в результатах.

Есть ли более простой способ?

ИЗМЕНИТЬ

Моя цель - создать таблицу в случае, если она не существует.

Ответы

Ответ 1

Если вы хотите создать базу данных, если она не существует, или получить значение "база данных уже существует", если она существует, вы можете сделать что-то вроде следующего:

r.dbList().contains('example_database')
  .do(function(databaseExists) {
    return r.branch(
      databaseExists,
      { dbs_created: 0 },
      r.dbCreate('example_database')
    );
  }).run();

Он вернет следующее, если оно создано:

{
  "config_changes": [
    {
      "new_val": {
        "id": "1ee7ddb4-6e2c-43bb-a0f5-64ef6a6211a8",
        "name": "example_database"
      },
      "old_val": null
    }
  ],
  "dbs_created": 1
}

И это, если оно уже существует:

{
  "dbs_created": 0
}

Ответ 2

Для существующей проверки таблицы я нашел следующее решение:

r.tableList().run(connection); //['people']

это вернет вам массив таблиц, которые определены в DB по умолчанию: ['people']. (если вы хотите установить его, выполните следующие действия: connection.use('test');)

тогда мы можем проверить, содержит ли массив имя нашей таблицы для создания.

_.some(tableNames, tableName)

все вместе:

  if (!_.isNil(tableName) && _.isString(tableName) && !_.isNil(connection)) {
    r.tableList().run(connection).then(function(tableNames) {
      if (_.includes(tableNames, tableName)) {
        return r.tableCreate(tableName).run(connection);
      } else {
        return;
        }
    });
  }

Ответ 3

В JavaScript, заданном массивом имен таблиц, самый короткий путь -

const tables = ['table1Name', 'table2Name', ...]
const db = 'myDb'

r(tables)
    .difference(r.db(db).tableList())
    .forEach(table => r.db(db).tableCreate(table))
    .run(connection)