2016-08-24 7 views
2

Я создаю сайт, на котором работает Django, и я хочу иметь отдельные базы данных для некоторых приложений, я создаю гибкий маршрутизатор, который направляет каждое приложение в предопределенную базу данных, это отлично работает. Проблема в том, что когда я переношу свои модели, я должен каждый раз устанавливать параметр --database, и я нахожу это раздражающим и избыточным. Также много раз я заливал свою базу данных по умолчанию таблицами из перенесенного приложения (забыв добавить --database). Я экспериментировал с функцией allow_migrate(...) в своем маршрутизаторе, но все, что я мог достигнуть, это механизм безопасности, который не будет запускать миграцию, если я забуду указать базу данных. Мой вопрос: есть ли способ настроить автоматический выбор базы данных для миграции моделей в Django? Мой подход может быть неправильным, меня удивляет, что никто, кажется, не делал этого раньше.Автоматический маршрутизатор db для миграции в django

ответ

1

Я не знаю, как это сделать автоматически. Однако простой подход может заключаться в write your own version команды migrate, которая несколько раз вызывает команду Django migrate с соответствующими аргументами --database и app.

По словам автора миграции Django, это a conscious design decision, поэтому я не ожидал, что он изменится: «Так же, как syncdb, миграция выполняется только по одной базе данных за раз, поэтому вы должны выполнить ее индивидуально для каждой базы данных , как вы предлагаете. Это по дизайну ».

+0

Спасибо за ссылку на обсуждение этой темы, кажется, что дизайн подсистем db/migrations не позволяет использовать мое предпочтительное решение. Я попробую ваше предложение. – Raff89

2

Для тех, кто сталкивается вопрос у меня был, вот что я, наконец, остановились на:

routers.py:

from django.conf import settings 
class DatabaseAppsRouter(object): 

    def db_for_read(self, model, **hints): 
     # your db routing 

    def db_for_write(self, model, **hints): 
     # your db routing 

    def allow_relation(self, obj1, obj2, **hints): 
     # your db routing 

    def allow_syncdb(self, db, model): 
     # your db routing 

    def allow_migrate(self, db, app_label, model_name=None, **hints): 
     if db in settings.DATABASE_APPS_MAPPING.values(): 
      return settings.DATABASE_APPS_MAPPING.get(app_label) == db 
     elif app_label in settings.DATABASE_APPS_MAPPING: 
      return False 

settings.py

DATABASE_ROUTERS = ['project.routers.DatabaseAppsRouter'] 
DATABASE_APPS_MAPPING = {'contenttypes': 'default', 
        'auth': 'default', 
        'admin': 'default', 
        'sessions': 'default', 
        'messages': 'default', 
        'staticfiles': 'default', 
        'myapp': 'mydb', 
        } 

Эта настройка позволяет мне запускать два компьютера Mands:

python manage.py migrate 
python manage.py migrate --database=mydb 

который еще один ко многим, но по крайней мере теперь я не могу ошибочно перенести MyApp в базу данных по умолчанию, которое произошло еще раз, что я хочу признать.


Предупреждение - декламация:

До этого момента я находил дизайн Django быть quircky, но очень логично и программист дружественные, как и сам питон. Но способ, которым миграция взаимодействует с несколькими настройками базы данных, на самом деле неудобен, настолько легко наполнить базу данных по умолчанию нежелательными таблицами. Обсуждение, связанное кевином в его ответе, показывает, что я не единственный, у кого есть такие трудности.

Смежные вопросы