Используйте несколько баз данных в Django, если другая база данных содержит таблицы, созданные не какой-либо моделью - PullRequest
1 голос
/ 09 июля 2019

Вот мои вопросы, и если вы хотите узнать подробности, просим вас обратиться к ним ниже (извините за длинный пост, я хотел, чтобы запрос был максимально подробным):

Вопросы

  1. Можно ли извлечь данные из внешней базы данных и использовать их внутри вашего проекта Django, даже если таблицы в этой базе данных НЕ созданы как модели? Если да, то какова основная концепция для достижения такой цели?

  2. Если НЕТ, то остается обходной путь - использовать ЖЕ БАЗУ ДАННЫХ в качестве удаленной и сохранить все модели проекта django в конкретной схеме в этой базе данных?


Итак, мы пытаемся принудительно внедрить Cross-database referencing с помощью удаленной базы данных my_remote_db, которая содержит таблицы, которые не созданы моделью Django.

Мы прочитали документ Django, в котором говорится, что в настоящее время он не может обработать такой метод ссылки, но тот факт, что мы можем определить несколько баз данных в settings.py, вселяет оптимизм в отношении того, что существует какой-то обходной путь.

Базы данных, как определено в наших settings.py

  • django_project_db - основная база данных (используемая нашим проектом Django для своих моделей)
  • my_remote_db - удаленная база данных. Несколько приложений используют эту базу данных, например наши приложения Scout и PHP и т. д.

enter image description here

Чего мы хотим достичь:

Получить данные из удаленной базы данных (таблицы НЕ созданы как model) и использовать эту информацию в нашем проекте Django.

Пример использования:

Предположим, мы хотим создать модель LeaveRequest в нашем проекте Django, которая содержит поле с именем employee, значением которого является id сотрудника, на который ссылается удаленная база данных в таблице my_remote_db.my_schema.employees.

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

Поскольку невозможно использовать models.ForeignKey из-за того, что таблицы удаленной базы данных не создаются в качестве моделей, мы бы хотели просто предварительно заполнить поле employee, выполнив команду raw SQL и передав результат как choices[('value','text')} например employee = models.IntegerField(choices[('1','Leonard Hofstadter'),('2','Sheldon Cooper')]

приписка

Мы попытались запустить следующее в оболочке Python, и мы получили бы

NotSupportedError: перекрестные ссылки на базы данных не реализованы: "my_remote_db.my_schema.employees"

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("SELECT first_name FROM my_remote_db.my_schema.employees WHERE id=1")
    row = cursor.fetchone()
    print(row)

ДОПОЛНИТЕЛЬНЫЕ ЗАМЕЧАНИЯ:

Удаленная база данных будет использоваться вместе с другими нашими приложениями и будет выполнять все операции CRUD. Удаленная БД не является устаревшей БД.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

После глубокого копания я смог найти решение.inspectdb был бы обходной путь, если бы только наша удаленная БД была унаследована, но это не так.Итак, мы снова просмотрели руководство DB router , которое решает проблему.Затем мы смогли передать данные из удаленной БД в наше приложение Django, выполнив собственный SQL напрямую согласно doc .

Мы думали, что маршрутизатор БД применим только в том случае, если у вас есть другойПриложение Django, базу данных которого вы хотите использовать в другом приложении Django в качестве удаленной БД.

0 голосов
/ 09 июля 2019

Вы должны рассматривать внешнюю базу данных как устаревшую БД.В этом случае вы должны реализовать модели этой БД с помощью команды inspectdb.План действий будет выглядеть следующим образом:

  1. Подключите внешнюю базу данных

  2. Обратный инжиниринг удаленных моделей с использованием inspectdb

  3. migrate для создания дополнительных таблиц django, таких как разрешения

Ознакомьтесь с официальными документами django , чтобы получить вместе с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...