Я могу подключить приложение к 2 базам данных?
У меня есть веб-приложение на Python django. Мне нужно импортировать пользователей и отображать данные о них из другой базы данных, из другого существующего приложения. Все, что мне нужно, это чтобы пользователь мог войти в систему и отобразить информацию о нем. Какие есть решения?
Вот что я думаю.
Иногда люди говорят "база данных", когда на самом деле это другая "схема".
В любом случае, вы должны выбрать одну из схем в качестве "главной" схемы.
- если это другая база данных, вам понадобится ссылка на базу данных для установления соединения .
- если это разные пользователи, одному из них придется
grant selectпредоставить привилегии другому (который затем сможет получать данные, принадлежащие другому пользователю)
Затем создайте view, который будет либо
- содержат только данные из другой схемы (поэтому вы будете отображать их отдельно), или
- представлять
UNIONданные из обеих схем (так что вы отобразите все данные сразу)
В конечном итоге, это представление будет источником на странице в вашем веб-приложении.
Вы можете установить 2 DATABASES в settings.py.
DATABASES = {
'default': {
...
},
'user_data': {
...
}
}
Тогда в одной базе данных хранятся User модели с аутентификацией и прочим, в другой - остальная информация. Вы можете связать информацию о конкретной User с полем, которое хранит id из User другой базы данных.
Вы можете установить 2 DATABASES в settings.py.
DATABASES = {
'default': {
...
},
'user_data': {
...
}
}
Тогда в одной базе данных хранятся User модели с аутентификацией и прочим, в другой - остальная информация. Вы можете связать информацию о конкретной User с полем, которое хранит id из User другой базы данных.
Если у вас несколько баз данных и вы создаете model, вы должны объявить, в какой db она будет храниться. Если вы этого не сделали, она будет храниться в default одной (если вы ее объявили).
class UserModel(models.Model):
class Meta:
db_table = 'default'
class UserDataModel(models.Model):
class Meta:
db_table = 'user_data'
ответ от @NixonSparrow был неправильным
_meta.db_table определено только имя_таблицы в базе данных, а не база данных self.
для базы данных switch можно использовать manager.using('database_name'), для каждой модели хорошо объявить здесь: https://docs.djangoproject.com/en/4.0/topics/db/multi-db/#topics-db-multi-db-routing
В моем проекте я использую несколько маршрутизаторов. https://docs.djangoproject.com/en/4.0/topics/db/multi-db/#topics-db-multi-db-routing
это помогает не переопределять каждый менеджер с помощью. Но в вашем случае:
DATABASES = {
'default': {
...
},
'other_users_data': {
...
}
}
и где-то там в представлениях:
other_users = otherUserModel.objects.using('other_users_data')
Возможно, otherUserModel должен определить в meta, какую таблицу вы хотите использовать db_table = 'other_users_table_name', а также, возможно, он должен иметь managed=False, чтобы скрыть эту модель от менеджера миграции.