Как запретить 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);
});
});
});