Вот мои вопросы, и если вы хотите узнать подробности, просим вас обратиться к ним ниже (извините за длинный пост, я хотел, чтобы запрос был максимально подробным):
Вопросы
Можно ли извлечь данные из внешней базы данных и использовать их внутри вашего проекта Django, даже если таблицы в этой базе данных НЕ созданы как модели? Если да, то какова основная концепция для достижения такой цели?
Если НЕТ, то остается обходной путь - использовать ЖЕ БАЗУ ДАННЫХ в качестве удаленной и сохранить все модели проекта 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](https://i.stack.imgur.com/3If9c.png)
Чего мы хотим достичь:
Получить данные из удаленной базы данных (таблицы НЕ созданы как 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. Удаленная БД не является устаревшей БД.