Django: взаимодействие с несколькими базами данных централизованно и в режиме только для чтения - PullRequest
0 голосов
/ 14 февраля 2020

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

Мне нужно использовать один дБ в качестве бэкэнда для моделей Django, а также мне нужен интерфейс Django приложений с другой устаревшей базой данных, но в этом случае только для чтения данных . Дополнительный контекст: я могу просто подключиться к устаревшей базе данных с пользователем с разрешениями на чтение и запись, но хочу быть уверенным, что устаревшая база данных используется в режиме только для чтения (по крайней мере неявно).

Более того, Мне нужно запросить устаревшую базу данных из многих приложений и представлений, поэтому централизованное управление соединениями было бы оптимальным решением как для управления конфигурацией в одном месте, так и для оптимизации ресурсов (соединений, курсоров и т. Д.)

Сначала я попытался создать объект соединения с библиотекой python и поделиться им между приложениями и представлениями проекта, но понял, что заново изобретаю колесо. Действительно, Django изначально поддерживает больше соединений с базами данных централизованным способом. Например, settings.py из Django do c:

DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit'
    },
    'legacy_db': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'priv4te'
    }
}

Насколько я понимаю, вторичные базы данных (например, legacy_db в приведенном выше примере) должны не подвержены никаким операциям записи во время нормального жизненного цикла приложений (например, миграции, взаимодействия ORM и т. д. c ...), если только явные команды или запросы не выполняются с использованием этих вторичных блоков.

Другими словами : если я выполняю только SELECT запросов к legacy_db, таких как:

from django.db import connections
cursor = connections['legacy_db'].cursor()
cursor.execute("SELECT * FROM foo")

, нет никакого риска написать что-либо в legacy_db.

Я открою это, возможно, тривиальное- вопрос, чтобы дважды проверить, верны ли мои предположения, и спросить вас, является ли это способом достижения того, что мне нужно в Django среде.

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