3

Post複数の MongoDB データベース (db1、db2、db3、...) にまたがるモデルを持つ Flask アプリがあるため、さまざまなデータベースにクエリを実行できる必要があります。エクステンション
を使用しています。Flask-MongoEngine

My__init__.pyには次の行が含まれています:
db = MongoEngine(app)
config.pyI have:
MONGODB_SETTINGS = {'DB': 'db1'}

私は成功せずに次のことを試しました:

  1. オブジェクトのconnectionパラメーターを次のよう に変更します。何も変更されませんでした。実行は元のデータベースで引き続き実行されました ( )。 db
    db.connection = mongoengine.connect('db2')
    post = Post.objects.all()db1
  2. 次のようにPostクラスにエイリアスを作成します。 次に、オブジェクトのパラメーターを次のように変更しました。 これにより、確かにへの接続が作成されますが別のデータベースに変更できませんでした。 meta
    'db_alias': 'db1'
    connectiondb
    db.connection = mongoengine.connect('db2', alias='db1')
    db2
  3. に設定MONGODB_SETTINGS{'DB': 'db2'}てからdb = MongoEngine(app)
    これもうまくいきません

モデルmodels.pyが読み込まれる (またはデータベースに接続される) と、その接続を変更できないようです。
あれは正しいですか?
同じモデルでデータベースを変更するにはどうすればよいですか?
編集: Django に相当するものはusing、同じモデルに対して異なる DB を照会できる ORM のパラメーターです。

4

1 に答える 1

2

あなたが正しく識別したように、MongoEngineインスタンスと、その結果、そこから作成されたすべてのドキュメント (モデル) は、特定のデータベースにバインドされます。

インスタンスでメソッドを呼び出すことにより、ドキュメント インスタンスで使用されるデータベースをドキュメントのクラスで定義されたエイリアスに(一時的に) 変更できます。switch_db

Post.objects.all().switch('db1').save()

がクラスのように定義されているdb1 場合 、すべてのドキュメントがデータベースに保存されます (それ以外の場合は が取得されます)。db1db_aliasPostConnectionError

または、初期構成を「動的」にする方法がいくつかあります。たとえば、環境変数を尊重します。

import os
app['MONGODB_SETTINGS'] = {'db': os.environ.get('DBNAME', 'db2')}

しかし、あなたのコメントから

私たちのシステムは、このモデルをホストするために多数のデータベースを使用しています

おそらく必要なのはShardingmongodで、MongoDB が複数のマシン上の複数のインスタンスにコレクションを分散するように処理します。その場合、mongos代わりにに接続し、クエリを適切なシャードにルーティングします。データベース名は各シャードで同じです。

于 2013-09-08T16:52:08.530 に答える