Найти - Пользователи
Полная версия: Multiple databases
Начало » Django » Multiple databases
1 2
del3d
DATABASES = {
'default': {
'ENGINE': 'mysql',
'NAME': 'db_1',
'USER': 'user',
'PASSWORD': '123',
},
'users': {
'ENGINE': 'mysql',
'NAME': 'db_2',
'USER': 'user',
'PASSWORD': '123',
}
}
При синхронизации модели с БД как сообщить какие таблицы создавать в db_1, а какие в db_2?
del3d
Я видел..
./manage.py syncdb –database=users
… using –database to control the database used
но все ровно не понял..
regall
del3d
но все ровно не понял..
If you don't want every application to be synchronized onto a particular database, you can define a database router that implements a policy constraining the availability of particular models.

Грубо говоря, syncdb синхронизирует все модели. Если вам нужно отдельные приложения в разные базы, пишете свой маршрутизатор (database router), там же в доке написано как это делается. Если не понятно из доки, поищите примеры, например, на stackoverfow.com.
del3d
А классы роутеров можно описать в отдельном файле? .. или где их место?
regall
del3d, поскольку роутеры относятся ко всему проекту сразу, я б их описывал в модуле в корне проекта. Никогда реально такого не делал, но такое решение мне кажется самым логичным.
del3d
Это какой-то пипец… убейте меня.. 5-й день пытаюсь врубиться в database router.. хрень какая-то.. ничо не понятно.. неужели нельзя сделать просто, привязать таблицу к БД и ВСЕ!!!
такая нужная шткуа и ни одного нормального мануала в сети..

Можно не отвечать.. это эмоции :-t
Ferroman
По ссылке regall всё написано с исчерпывающими примерами.
del3d
# settings.py
...
DATABASES = {
'default': {
'ENGINE': 'mysql',
'NAME': 'default',
'USER': 'root',
'PASSWORD': '123',
},
'mydb': {
'ENGINE': 'mysql',
'NAME': 'mydb',
'USER': 'root',
'PASSWORD': '123',
}
}
DATABASE_ROUTERS = ['project.router.MyAppRouter']
...
# router.py
class MyAppRouter(object):

def db_for_read(self, model, **hints):
if model._meta.app_label == 'myapp':
return 'mydb'
return None

def db_for_write(self, model, **hints):
if model._meta.app_label == 'myapp':
return 'mydb'
return None

def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'myapp' or obj2._meta.app_label == 'myapp':
return True
return None

def allow_syncdb(self, db, model):
if db == 'mydb':
return model._meta.app_label == 'myapp'
elif model._meta.app_label == 'myapp':
return False
return None
Как мне сделать класс роутера так, чтобы модели моих приложений сохранялись в mydb а модели django-приложений в базе default.
У меня пока одно приложение - myapp.
Сейчас у меня все в default записывается и только модели django-проектов..
del3d
def allow_syncdb(self, db, model):
if db == 'mydb':
return False
else:
return True
Так все записывается в default
.. а так:
def allow_syncdb(self, db, model):
if db == 'mydb':
return True
else:
return False
django.db.utils.DatabaseError: (1146, “Table ‘default.django_content_type’ doesn't exist”)
Получается, что django-таблицы хотят в БД default ??
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB