2013-04-15 77 views
3

我有一個Post模型Flask應用程序跨越多個MongoDB數據庫(db1,db2,db3,...),所以我需要能夠查詢不同的dbs。
我使用的是Flask-MongoEngine擴展名。Flask MongoEngine - 如何更改數據庫?

__init__.py包含以下行:
db = MongoEngine(app)
config.py我:
MONGODB_SETTINGS = {'DB': 'db1'}

我嘗試沒有成功如下:

  1. 改變connection參數在db對象像這樣:
    db.connection = mongoengine.connect('db2')
    它沒有改變任何東西。執行post = Post.objects.all()仍然在原始分貝上運行(db1)。
  2. metaPost類像這樣創建別名:
    'db_alias': 'db1'
    後來我改變了connection參數在db對象是這樣的:
    db.connection = mongoengine.connect('db2', alias='db1')
    這確實創造db2我不能連接不會將其更改爲另一個數據庫。
  3. 設置MONGODB_SETTINGS{'DB': 'db2'}然後db = MongoEngine(app)
    這並不工作,以及

好像曾經在models.py模型已經被加載(或連接到一個數據庫),你不能改變它的連接。
這是正確的嗎?
如何更改相同型號的數據庫?
編輯:相當於Django的是ORM中的using參數,它允許查詢同一模型的不同數據庫。

+0

你爲什麼要這樣做? – ford

+0

我們的系統使用大量數據庫來託管此模型。這就是它的設計原理,所以我幾乎受限於當前的架構。 – user1102018

回答

2

正如您正確識別的那樣,一個實例以及由此創建的所有文檔(模型)都會綁定到特定的數據庫。

你可以(暫時)改變通過調用實例上的switch_db方法使用文檔實例在文檔類定義的別名數據庫:

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

將保存在數據庫中的所有文件db1如果db1Post類中定義爲db_alias(否則您將獲得ConnectionError)。

或者,有多種方法可使初始配置「動態」,例如尊重環境變量:

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

不過,從您的評論

我們的系統使用多個數據庫,舉辦這個模型

似乎有什麼你可能要爲Sharding,其中MongoDB負責通過多臺機器上的多個mongod實例分配集合。在這種情況下,您可以連接到mongos,這樣可以將查詢路由到右邊的分片。每個分片上的數據庫名稱都是相同的。