問題描述
出于性能原因,我正在考慮將我的網站后端從 Postgres 轉移到 Mongo,但該網站的關鍵部分依賴 GeoDjango 模型來計算現實世界中對象之間的距離(等等).
I'm thinking about shifting my site's backend to Mongo from Postgres for performance reasons, but key parts of the site rely on the GeoDjango models to calculate distances between objects in the real world (and so on).
讓大部分站點在 Mongo 上運行但那些關鍵區域使用 Postgres 進行存儲是否可行?這是痛苦的和/或容易出錯的嗎?是否有我缺少的全 Mongo 解決方案?
Would it be feasible to have most of the site running on Mongo but those key areas using Postgres for storage? Is this painful and / or error-prone? Is there an all-Mongo solution I'm missing?
如果您能為我提供關于這些問題的任何啟示,我們將不勝感激.
Any light you can shed on these matters for me would be much appreciated.
推薦答案
從Django 1.2開始,你可以在您的 settings.py
中定義多個數據庫連接.然后你可以使用數據庫路由器 告訴 Django 去哪個數據庫,對你的應用程序透明.
Since Django 1.2, you can define multiple datbase connections in your settings.py
. Then you can use database routers to tell Django which database to go to, transparently for your application.
免責聲明:這就是我認為應該如何工作的方式,我從未在 Django 中使用過 MongoDB,也沒有測試過我的代碼是否真的有效.:)
Disclaimer: this is how I think it should work, I have never used MongoDB in Django, nor have I tested that my code actually works. :)
DATABASES = {
'default': {
'ENGINE': 'django_mongodb_engine',
'NAME': 'mydata',
...
}
'geodata' {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'geodata',
...
}
}
DATABASE_ROUTERS = ['path.to.ModelMetaRouter']
型號
然后將自定義元變量添加到您的地理表中,以覆蓋其數據庫.不要將此屬性添加到應該轉到默認數據庫的模型中.
Models
Then add custom Meta variables to your geo-tables, to override their database. Don't add this attribute to models that are supposed to go to the default database.
class SomeGeoModel(models.Model):
...
class Meta:
using = 'geodata'
數據庫路由器
并編寫一個數據庫路由器來將所有具有 using
元屬性集的模型定向到適當的連接:
Database router
And write a database router to direct all models that have the using
meta attribute set, to the appropriate connection:
class ModelMetaRouter(object):
def db_for_read(self, model, **hints):
return getattr(model._meta, 'using', None)
def db_for_write(self, model, **hints):
return getattr(model._meta, 'using', None)
def allow_relation(self, obj1, obj2, **hints):
# only allow relations within a single database
if getattr(obj1._meta, 'using', None) == getattr(obj2._meta, 'using', None):
return True
return None
def allow_syncdb(self, db, model):
if db == getattr(model._meta, 'using', 'default'):
return True
return None
這篇關于混合 PostgreSQL 和 MongoDB(作為 Django 后端)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!