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