Ali*_*air 13 python django postgresql mongodb nosql
出于性能原因,我正考虑将我的网站的后端从Postgres转移到Mongo,但网站的关键部分依赖于GeoDjango模型来计算现实世界中对象之间的距离(等等).
让大部分网站在Mongo上运行但使用Postgres进行存储的关键区域是否可行?这是痛苦和/或容易出错吗?我缺少一个全蒙哥解决方案吗?
你能为我解决这些问题的任何亮点都会非常感激.
从Django 1.2开始,您可以在您的数据库中定义多个数据库连接settings.py.然后,您可以使用数据库路由器告诉Django哪个数据库可以透明地传输给您的应用程序.
免责声明:这就是我认为它应该工作的方式,我从来没有在Django中使用过MongoDB,也没有测试过我的代码实际上是否正常工作.:)
DATABASES = {
'default': {
'ENGINE': 'django_mongodb_engine',
'NAME': 'mydata',
...
}
'geodata' {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'geodata',
...
}
}
DATABASE_ROUTERS = ['path.to.ModelMetaRouter']
Run Code Online (Sandbox Code Playgroud)
然后将自定义Meta变量添加到地理表中,以覆盖其数据库.不要将此属性添加到应该转到默认数据库的模型.
class SomeGeoModel(models.Model):
...
class Meta:
using = 'geodata'
Run Code Online (Sandbox Code Playgroud)
并编写一个数据库路由器,将具有using元属性集的所有模型定向到适当的连接:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6225 次 |
| 最近记录: |