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',
}
}
}
...
... 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', } } } ...
...
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)
...
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) ...
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)
...
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) ...
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) базу данных