В 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)