Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 30, 2010 22:23:14

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Multiple databases

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?



Отредактировано (Ноя. 30, 2010 22:23:28)

Офлайн

#2 Ноя. 30, 2010 22:28:15

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Офлайн

#3 Ноя. 30, 2010 22:48:07

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Multiple databases

Я видел..
./manage.py syncdb –database=users
… using –database to control the database used
но все ровно не понял..



Офлайн

#4 Ноя. 30, 2010 23:08:33

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Multiple databases

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.



Офлайн

#5 Дек. 3, 2010 18:49:08

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Multiple databases

А классы роутеров можно описать в отдельном файле? .. или где их место?



Офлайн

#6 Дек. 3, 2010 21:20:16

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Multiple databases

del3d, поскольку роутеры относятся ко всему проекту сразу, я б их описывал в модуле в корне проекта. Никогда реально такого не делал, но такое решение мне кажется самым логичным.



Отредактировано (Дек. 3, 2010 21:20:27)

Офлайн

#7 Дек. 6, 2010 16:21:14

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Multiple databases

Это какой-то пипец… убейте меня.. 5-й день пытаюсь врубиться в database router.. хрень какая-то.. ничо не понятно.. неужели нельзя сделать просто, привязать таблицу к БД и ВСЕ!!!
такая нужная шткуа и ни одного нормального мануала в сети..

Можно не отвечать.. это эмоции :-t



Офлайн

#8 Дек. 7, 2010 00:10:24

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Multiple databases

По ссылке regall всё написано с исчерпывающими примерами.

Офлайн

#9 Дек. 7, 2010 20:53:11

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Multiple databases

# 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-проектов..



Офлайн

#10 Дек. 8, 2010 10:43:26

del3d
От:
Зарегистрирован: 2010-03-12
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Multiple databases

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 ??



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version