Я могу подключить приложение к 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, чтобы скрыть эту модель от менеджера миграции.

Вернуться на верх