Django 1.0.2中的多个数据库,带有自定义管理器

时间:2009-04-22 20:26:10

标签: django django-models

我在用户组中问这个没有回应,所以我想我会在这里试试。 我正在尝试设置自定义管理器以连接到另一个数据库 与我的默认mysql连接在同一台服务器上。我试过了 按照示例herehere但没有运气。返回时我得到一个空元组 MyCustomModel.objects.all()

以下是我在manager.py中的内容

from django.db import models 
from django.db.backends.mysql.base import DatabaseWrapper 
from django.conf import settings 
class CustomManager(models.Manager): 
    """ 
    This Manager lets you set the DATABASE_NAME on a per-model basis. 
    """ 
    def __init__(self, database_name, *args, **kwargs): 
        models.Manager.__init__(self, *args, **kwargs) 
        self.database_name = database_name 
    def get_query_set(self): 
        qs = models.Manager.get_query_set(self) 
        qs.query.connection = self.get_db_wrapper() 
        return qs 
    def get_db_wrapper(self): 
        # Monkeypatch the settings file. This is not thread-safe! 
        old_db_name = settings.DATABASE_NAME 
        settings.DATABASE_NAME = self.database_name 
        wrapper = DatabaseWrapper() 
        wrapper._cursor(settings) 
        settings.DATABASE_NAME = old_db_name 
        return wrapper 

这就是我在models.py中的内容:

from django.db import models 
from myproject.myapp.manager import CustomManager 
class MyCustomModel(models.Model): 
    field1  = models.CharField(max_length=765) 
    attribute = models.CharField(max_length=765) 
    objects = CustomManager('custom_database_name') 
    class Meta: 
        abstract = True 

但如果我运行MyCustomModel.objects.all(),我会得到一个空列表。

我对这些东西很新,所以我不确定这是否适用 1.0.2,我将查看Manager代码,看看我是否可以计算 它出来但我只是想知道我在这里做错了什么。

更新: 这个现在在Django主干中,将成为1.2版本的一部分 http://docs.djangoproject.com/en/dev/topics/db/multi-db/

3 个答案:

答案 0 :(得分:4)

您可能希望与Alex Gaynor通话,因为他正在添加MultiDB支持,并且可能会在Django 1.2中发布可能的版本。我相信他会很感激那些将要使用MultiDB的人的反馈和意见。在django-developers主列表中有关于它的讨论。他的MultiDB分支甚至可以使用,我不确定。

因为我猜你可能不能等待,如果MultiDB分支不可用,这里有你的选择。

  • 关注Eric Flows method,记住它不受支持和Django的新发布可能会破坏它。此外,一些评论建议already been broken。这将是hacky。
  • 您的另一个选择是为您的某个数据库使用完全不同的数据库访问方法。也许SQLAlchemy为一个,然后是Django ORM。我猜想一个人可能更加以Django为中心而另一个是遗留数据库。

总结一下。我认为将MultiDB攻击到Django可能是错误的方法,除非你准备好以后继续维护你的黑客。因此,我认为另一个ORM或数据库访问将为您提供最干净的路径,因为您不会使用支持的功能,并且在一天结束时,它只是Python。

答案 1 :(得分:1)

我的公司通过密切关注此博客文章http://www.eflorenzano.com/blog/post/easy-multi-database-support-django/

成功使用多个数据库

答案 2 :(得分:0)

如果您将所需的一切都移到一个数据库中,这可能不是t the answer your looking for, but it