2

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 が「テスト」データベースを自動的に作成しないようにするにはどうすればよいでしょうか? または、名前の競合が発生した場合にデータベースを削除する方法は?

4

2 に答える 2

0

を使用rethinkdb createしてデータ ディレクトリを作成すると、testデータベースは作成されません。

たとえば、rethinkdb_data存在しない場合、testデータベースなしで作成されます。

rethinkdb create
rethinkdb

これは同じことを行い-dますが、データディレクトリの場所を指定するために使用します:

rethinkdb create -d /var/lib/rethinkdb/data
rethinkdb -d /var/lib/rethinkdb/data
于 2016-11-01T20:19:23.683 に答える
0

しばらく掘り下げた後、test起動時に RethinkDB がデフォルトのデータベースを作成しようとするのを防ぐための適切なオプションが見つかりませんでした。上記の問題は、クラスタ ノードが異なるデータ ディレクトリを使用している場合にのみ発生します。testそれ以外の場合、他のノードはデータベースが既に存在することを認識するだけなので (起動した最初のノードによって作成されます)、追加のデータベースを作成しようとしません。

データベースのテーブルtestから起動時に名前が付けられたすべてのデータベースを列挙することにより、バックエンドソフトウェアでこれを解決することになりました。db_configrethinkdb

例:

// 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);
           });
     });
});
于 2016-10-28T11:41:12.700 に答える