Как запретить RethinkDB создавать тестовую базу данных

Когда вы запускаете экземпляр rethinkdb, он автоматически создает базу данных с именем 'test'. Когда вы запускаете несколько экземпляров и кластеризуете их, используя rethinkdb proxy это приводит к проблеме:

Database name conflict: test is the name of more than one database

Если вы пытаетесь удалить базы данных, т.е. с помощью

r.dbDrop('test').run(conn, function(result) {
   console.log(result) // Will result in error
});

Это приведет к следующей ошибке:

ReqlOpFailedError: Database 'test' is ambiguous; there are multiple databases with that name in r.dbDrop("test")

Так как же запретить RethinkDB автоматически создавать тестовую базу данных? Или как удалить базу данных, если вы столкнулись с конфликтом имен?

2 ответа

Решение

Если вы используете rethinkdb create создать каталог данных, нет test База данных будет создана.

Например, если rethinkdb_data не существует, это создаст его без test база данных:

rethinkdb create
rethinkdb

Это будет делать то же самое, но использует -d чтобы указать местоположение каталога данных:

rethinkdb create -d /var/lib/rethinkdb/data
rethinkdb -d /var/lib/rethinkdb/data

Покопавшись некоторое время, я не нашел подходящих вариантов, чтобы RethinkDB не пытался создать значение по умолчанию. test база данных при запуске. Проблема выше возникает только тогда, когда узлы кластера используют разные каталоги данных. В противном случае они не будут пытаться создать дополнительные test базы данных, поскольку другие узлы просто распознают, что он уже существует (созданный первым запущенным узлом).

Я решил эту проблему в своем программном обеспечении, перечислив всю базу данных с именем test во время запуска из db_config стол в rethinkdb база данных.

Пример:

// Read from the database 'rethinkdb' that holds information about other databases
r.db("rethinkdb")

// Table db_config contains database id, name information
 .table("db_config")

// Filter by name 'test'
 .filter({name: "test"})
 .run(conn, function(err, cursor) {

     // Get results from cursor by id and rename
     cursor.each(function(err, result){
         r.db("rethinkdb")
          .get(result.id)
          .update({name: "other_name"})
          .run(conn, function(err, result) {
              console.log(result.replaced);
           });
     });
});
Другие вопросы по тегам