django подключение второй базы данных без моделей

Может понадобится, например, когда нужно перенести какие то данные из одной базы данных, в базу данных под управлением 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) базу данных