2009-04-22 6 views
6

Я спросил об этом в группе пользователей без ответа, поэтому я решил попробовать здесь. Я пытаюсь настроить пользовательский менеджер для подключения к другой базе данных на том же сервере, что и мое mysql-соединение по умолчанию. Я пробовал , следуя примерам here и here, но не повезло. Я получаю пустой кортеж при возврате MyCustomModel.objects.all().Несколько баз данных в Django 1.0.2 с настраиваемым менеджером

Вот что я имею в 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, я буду смотреть в код менеджера, чтобы увидеть, если я могу понять его, но я просто интересно, если я я делаю что-то неправильно здесь.

UPDATE: Это сейчас в багажнике Django и будет частью 1.2 выпуска http://docs.djangoproject.com/en/dev/topics/db/multi-db/

+0

Это нарушает некоторые существенные особенности Django. Единственное соединение с базой данных находится в вашем модуле настроек. Что вы на самом деле пытаетесь сделать? Вы должны рассмотреть другие подходы, а не разбить Django. –

+0

Если вы посмотрите на примеры, которые я пытаюсь использовать, один из Адриана. У меня есть решение для работы, где я использую вспомогательный модуль и просто переопределяю функцию сохранения в модели, но это немного хак, и я не получаю никаких преимуществ django. Если у вас есть предложение о том, как добавить поддержку нескольких баз данных в приложение, пожалуйста, дайте мне знать. –

+0

Можете ли вы быть немного более терпеливым? Сейчас идет проект GSOC, который добавляет к Django поддержку нескольких баз данных. – ironfroggy

ответ

4

Вы можете поговорить с Alex Gaynor, как он добавляет поддержку MultiDB и его привязанный для возможного выпуска в Django 1.2. Я уверен, что он оценит обратную связь и вклад от тех, которые будут использовать MultiDB. Об этом в дискуссионном списке django-developers. Его филиал MultiDB может даже использоваться, я не уверен.

Поскольку я думаю, вы, вероятно, не можете дождаться, и если ветвь MultiDB не пригодна для использования, вот ваши варианты.

  • Следуйте за Eric Flows method, имея в виду, что его не поддерживается, и новый выпущенный Django может сломать его. Кроме того, некоторые комментарии предлагают его already been broken. Это будет хаки.
  • Другим вариантом будет использование совершенно другого метода доступа к базе данных для одной из ваших баз данных. Возможно, SQLAlchemy для одного, а затем для Django ORM. Я собираюсь предположить, что, вероятно, будет больше, чем Django, а другой - устаревшей базой данных.

Подводя итог. Я думаю, что взломать MultiDB в Django - это, вероятно, неправильный путь, если вы не готовы идти в ногу с поддержкой своих хаков. Поэтому я думаю, что другой доступ ORM или базы данных даст вам самый чистый маршрут, так как тогда вы не выходите с поддерживаемыми функциями, а в конце дня его все просто Python.

+1

Похоже, что теперь это было поручено сундуку, и у него также есть документы. Http://docs.djangoproject.com/ru/dev/topics/db/multi-db/ –

+0

Yup. У этого наверняка есть и его удивительный: D –

0

Это, вероятно, ISN t the answer your looking for, but it наверное лучше всего, если вы двигаете все, что нужно в одной базе данных.

+0

Спасибо, spence, это не вариант, потому что я хочу получить доступ к данным из других приложений, таких как freeradius. –

1

Моя компания имела успех, используя несколько баз данных, внимательно следуя блоге: http://www.eflorenzano.com/blog/post/easy-multi-database-support-django/

+0

Спасибо Bluu Я думаю, что видел это раньше, но не уверен, пробовал ли я это или нет. Мое приложение работает с некоторыми вспомогательными методами, которые имеют собственное соединение с mysql, поэтому мне придется ждать v2. –