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/
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. –
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ć. –
Czy możesz być trochę bardziej cierpliwy? W tej chwili trwa projekt GSOC, który dodaje obsługę wielu baz danych do Django. – ironfroggy