Может понадобится, например, когда нужно перенести какие то данные из одной базы данных, в базу данных под управлением django. В таком случае, по первой базе данных нет необходимости (или невозможно) формировать модели.
При необходимости, к первой базе тоже можно применить модели в django приложении.
Первым делом, добавляем второе подключение («sourcedb«), наряду с основным («default«) в файле конфигов settings.py. Для примера, у нас mysql:
... DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "DATABASE_NAME_default", "HOST": "DATABASE_HOST_default", "PORT": "3306", "USER": "DATABASE_USER_default", "PASSWORD": "DATABASE_PASSWORD_default", 'OPTIONS': { 'sql_mode': 'traditional', } }, "sourcedb": { "ENGINE": "django.db.backends.mysql", "NAME": "DATABASE_NAME_sourcedb", "HOST": "DATABASE_HOST_sourcedb", "PORT": "3306", "USER": "DATABASE_USER_sourcedb", "PASSWORD": "DATABASE_PASSWORD_sourcedb", 'OPTIONS': { 'sql_mode': 'traditional', } } } ...
Теперь можно использовать второе подключение для забора данных:
1) одну запись (fetchone):
from django.db import connections … def get_single_record_from_second_database(order_number): try: with connections['sourcedb'].cursor() as cursor: cursor.execute("""SELECT id, `sum`, user_id FROM orders WHERE order_number = '%s' """ % order_number) order = cursor.fetchone() cursor.close() except Exception as error: print("Failed to read data from Orders table (for %s):" % order_number, error) ...
2) или обрабатываем много записей (fetchall)
from django.db import connections … def get_multiple_records_from_second_database(date): try: with connections['sourcedb'].cursor() as cursor: cursor.execute("""SELECT id, `sum`, user_id FROM orders WHERE date = '%s' """ % date) orders = cursor.fetchall() for order in orders: ... cursor.close() except Exception as error: print("Failed to read data from Orders table (for %s):" % date, error) ...
В цикле for можно обрабатывать заказы (order) и заполнять данными основную (default) базу данных