Как проще всего в RethinkDB проверить, существует ли база данных или таблица?

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

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

ИЗМЕНИТЬ

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


person André Pena    schedule 25.07.2015    source источник
comment
например, вы можете попробовать создать таблицу, если она уже существует, вы увидите ошибку: RqlRuntimeError: Таблица уже существует   -  person Suvitruf - Andrei Apanasik    schedule 25.07.2015
comment
Чего вы пытаетесь достичь? Вы хотите создать базу данных, если она не существует, или просто проверить, существует ли она?   -  person Tholle    schedule 25.07.2015
comment
@Suvitruf, спасибо за ответ. Меня не очень интересовало выдавать ошибку. Я просто хотел проверить, существует ли она.   -  person André Pena    schedule 26.07.2015
comment
@Толле, да. Я хочу создать таблицу на случай, если она не существует.   -  person André Pena    schedule 26.07.2015


Ответы (4)


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

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
}
person Tholle    schedule 26.07.2015
comment
@Tholle, почему так сложно? моя версия с питоном: for table in self.tables: if not rdb.db(self.db).table_list().contains(table).run(): rdb.db(self.db).table_create(table).run() - person holms; 12.06.2016

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

r.tableList().run(connection); //['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;
        }
    });
  }
person xyztdanid4    schedule 25.09.2016

В JavaScript для заданного массива имен таблиц кратчайшим путем является

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

r(tables)
    .difference(r.db(db).tableList())
    .forEach(table => r.db(db).tableCreate(table))
    .run(connection)
person vbranden    schedule 29.11.2017
comment
Разве вам не нужно run() после r.db(db).tableList()? - person Théo Champion; 21.09.2018
comment
Нет, вам нужно только вызвать run в конце всего запроса. - person vbranden; 21.09.2018

Для тех, кто приходит с VB.net, решение будет таким.. один лайнер

Dim RDBDatabase as String = "dbName" 
Dim RDBTable as String = "tableName"  
   
Dim CheckDB = R.DbList().Contains(RDBDatabase).Do_(Function(databaseExists) R.Branch(databaseExists, "db done", R.DbCreate(RDBDatabase))).And(R.Db(RDBDatabase).TableList().Contains(RDBTable).Do_(Function(tableExists) R.Branch(tableExists, "tb done", R.Db(RDBDatabase).TableCreate(RDBTable)))).Run(conn)

Это создаст БД, если она не существует, и создаст таблицу, если она не существует.

Если ни один из них не существует, он вернет значения из последней созданной таблицы.

{{
  "config_changes": [
    {
      "new_val": {
        "db": "dbName",
        "durability": "hard",
        "id": "0f72a570-7998-49f7-affc-96cbdd1ea086",
        "indexes": [],
        "name": "tableName",
        "primary_key": "id",
        "shards": [
          {
            "nonvoting_replicas": [],
            "primary_replica": "replicasssss_iu1",
            "replicas": [
              "replicasssss_iu1"
            ]
          }
        ],
        "write_acks": "majority"
      },
      "old_val": null
    }
  ],
  "tables_created": 1
}}
person Dumidor Dumbleplex    schedule 17.05.2021