2015-01-02 2 views
1

У меня есть типичный проект Django с одной первичной базой данных, где я храню все необходимые мне данные.Модели Django с внешними DB

Предположим, что есть еще одна БД с некоторой дополнительной информацией. Эта БД напрямую не связана с моим проектом Django, поэтому давайте предположим, что у меня даже нет элемента управления под ним.

Проблема в том, что я знаю, нужно ли мне создавать и поддерживать модель для этой внешней БД, чтобы я мог использовать ORM Django. Или, может быть, лучшим решением является использование raw SQL для извлечения данных из внешней БД, а затем использование этого ifo для фильтрации данных из первичной БД с использованием ORM или непосредственно в представлениях.

Решение с созданием модели выглядит вполне нормально, но тот факт, что БД не является частью моего проекта, означает, что я не знаю о возможных изменениях схемы и, похоже, это плохая практика.

Таким образом, в конце концов, если у меня есть какие-то внешние ресурсы, такие как БД, которые не связаны с, но необходимые для моего проекта я должен:

  • Try для создания моделей Джанго для них
  • Используйте необработанный SQL, чтобы получить info от внешнего БД, а затем использовать его для фильтрации данных из первичной БД с помощью ОРМ, а также с использованием данных непосредственно в представлениях, если необходимо
  • Использовать необработанный SQL как для первичной, так и для внешней БД, где они пересекаются в логике приложения
+0

Несколько вопросов: - Есть ли API, который вы могли бы использовать для доступа к данным, которые вам нужны? Если да, это может быть жизнеспособным решением для получения необходимого вам - Ожидаете ли вы, что данные в этой базе данных будут часто меняться, и вам нужно быть в курсе этих изменений? Если нет, вы можете просто создать свою собственную базу данных с дампом данных, которые вас интересуют, и поместить их в DjangoModel. –

+0

На самом деле это мое внешнее приложение. Но я решил задать более широкий вопрос. Дамп не является решением проблемы. Данные часто меняются. Например, есть две биллинговые панели, и у вас есть один METAbilling, который собирает данные из них. Например, эти два биллинга - это whmcs и awbs. Я понятия не имею, как они собираются изменить схему БД. – Glueon

ответ

0

Предлагаю вам прочитать информацию об инспекторах и маршрутизаторах баз данных. Для управления внешней БД можно использовать django ORM. https://docs.djangoproject.com/en/1.7/ref/django-admin/#inspectdb

+0

Мне известны эти инструменты и вам нужен совет, основанный на опыте. Насколько я понимаю, вы говорите, что я должен «попытаться создать для них модели django». Поэтому каждый раз, когда схема менялась немного, мне приходится переписывать свои модели. – Glueon

0

Я хотел бы создать минимальные модели Джанго на внешних базах данных => те, которые взаимодействуют с вашим кодом:

Несколько результатов в этом

  1. Если части базы данных вы не заинтересованы в изменении, это не повлияет на ваше приложение.
  2. Если внешние модели используют ваши изменения, вы, вероятно, захотите узнать об этом как можно быстрее (ваше приложение также может сломаться и в этом случае).
  3. Все запросы реляционных баз данных в вашем коде обрабатываются одним и тем же ORM.
2

Альтернативой является использование SQLAlchemy для внешней базы данных. Он может использовать reflection для генерации эквивалентных SQLAlchemy моделей django во время выполнения.

Это все еще не будет без проблем. Если ваш код зависит от определенного столбца, он все равно будет разбит, если этот столбец будет удален или изменен несовместимым образом. Тем не менее, это добавит немного большей гибкости для взаимодействия с базой данных, например. модель Django определенно сломается, если столбец int будет изменен на столбец varchar, но с использованием отражения базы данных он будет разорваться, только если ваш код зависит от того, что это int. Если вы просто покажете данные или что-то еще, оно останется полностью функциональным. Тем не менее, всегда есть шанс, что изменение не нарушит систему, но вызывает неожиданное поведение.

Если, как сказал Бенджамин, внешняя система имеет API, это было бы предпочтительным выбором.

+0

Ваш ответ звучит хорошо. Я не думал об отражении. – Glueon

+0

На самом деле, пытаясь использовать этот подход, я столкнулся с проблемой - где и как мне интегрировать SQLAlchemy в мои представления, формы и т. Д.? Наивный подход заключался в том, чтобы добавить весь подключаемый DB-журнал и выбор данных в get_queryset, который я не очень доволен. Что с формами тогда? Пожалуйста, если возможно, укажите короткий пример. – Glueon

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