2009-04-22 18 views
6

Zapytałem o to w grupie użytkowników bez odpowiedzi, więc pomyślałem, że spróbuję tutaj. Próbuję skonfigurować niestandardowego menedżera, aby połączyć się z inną bazą danych na tym samym serwerze, co moje domyślne połączenie mysql. Próbowałem następujących przykładów here i here, ale nie miałem szczęścia. Po powrocie otrzymuję pustą krotkę MyCustomModel.objects.all().Wiele baz danych w Django 1.0.2 z niestandardowym menedżerem

Oto co mam w 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 

i tutaj jest to, co mam w 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 

Ale jeśli uruchomię MyCustomModel.objects.all() dostaję pustą listę.

Jestem całkiem nowy w tym rzeczy, więc nie jestem pewien, czy to działa z 1.0.2, mam zamiar zajrzeć do kodu Manager, aby zobaczyć, czy mogę dowiedzieć go, ale jestem po prostu zastanawiasz się, czy I robię coś złego tutaj.

UPDATE: To teraz w Django tułowia i będzie częścią 1.2 uwolnienia http://docs.djangoproject.com/en/dev/topics/db/multi-db/

+0

To narusza niektóre zasadnicze funkcje Django. Połączenie z pojedynczą bazą danych znajduje się w module ustawień. Co tak naprawdę próbujesz zrobić? Powinieneś rozważyć inne podejścia, zamiast łamać Django. –

+0

Jeśli spojrzysz na przykłady, których próbuję użyć, jeden pochodzi od Adriana. Mam pracę dookoła rozwiązania, w którym korzystam z modułu pomocnika i po prostu nadpisuję funkcję zapisu w modelu, ale jest to trochę hack i nie dostaję żadnych korzyści dla django. Jeśli masz sugestię, jak dodać obsługę wielu baz danych do aplikacji, daj mi znać. –

+0

Czy możesz być trochę bardziej cierpliwy? W tej chwili trwa projekt GSOC, który dodaje obsługę wielu baz danych do Django. – ironfroggy

Odpowiedz

4

Możesz mówić do Alex Gaynor jak on jest dodanie wsparcia MultiDB i jej sztywny kurs do ewentualnego wydania w Django 1.2. Jestem pewien, że doceniłby opinie i opinie od tych, którzy zamierzają używać MultiDB. Dyskusje na ten temat znajdują się na liście do sprawdzania. Jego oddział MultiDB może być nawet użyteczny, nie jestem pewien.

Ponieważ prawdopodobnie nie możesz się doczekać i jeśli oddział MultiDB nie nadaje się do użytku, oto twoje opcje.

  • Postępuj zgodnie z Eric Flows method, pamiętając, że nie jest obsługiwany i nowy wydany z Django może go złamać. Ponadto niektóre komentarze sugerują jego already been broken. To będzie hacky.
  • Inną opcją byłoby użycie zupełnie innej metody dostępu do baz danych dla jednej z baz danych. Być może SQLAlchemy dla jednego, a następnie ORM Django. Przechodzę przez przypuszczenie, że jeden może być bardziej skoncentrowany na Django, a drugi jest starszą bazą danych.

Podsumowując. Myślę, że włamywanie się do Django w MultiDB jest prawdopodobnie niewłaściwym sposobem, chyba że przygotujesz się do utrzymania hacków później. Dlatego myślę, że inny dostęp do ORM lub bazy danych dałby ci najczystszą trasę, ponieważ wtedy nie będziesz obsługiwał obsługiwanych funkcji, a pod koniec dnia - tylko Python.

+1

Wygląda na to, że zostało to przypisane do bagażnika teraz i ma również dostępne dokumenty http://docs.djangoproject.com/en/dev/topics/db/multi-db/ –

+0

Yup. To na pewno ma i jest niesamowite: D –

0

To prawdopodobnie nieprawdaż t the answer your looking for, but it s prawdopodobnie najlepiej, jeśli przenieść wszystko, czego potrzeba do jednej bazy danych.

+0

Dzięki spence, to nie jest tak naprawdę opcja, ponieważ chcę uzyskać dostęp do danych z innych aplikacji, takich jak freeradius. –

1

Moja firma miała powodzenie korzystania z wielu baz danych przez ściśle naśladują tego blogu: http://www.eflorenzano.com/blog/post/easy-multi-database-support-django/

+0

Dzięki Bluu Myślę, że widziałem to wcześniej, ale nie jestem pewien, czy próbowałem, czy nie. Moja aplikacja pracuje z niektórymi metodami pomocniczymi, które mają swoje własne połączenie mysql, więc to będzie musiało poczekać na v2. –