Использование внешней базы данных SQL Server в Django

Я пытаюсь сделать Django-сайт, который подключается к внешней базе данных SQL Server для получения информации (только для чтения). Эта база данных огромна и содержит сотни таблиц.

В настоящее время я могу заставить его работать, создав функцию в моем приложении Django, которая использует connectionString и выполняет необработанный SQL-запрос и возвращает его в pandas dataframe.

Почему-то мне кажется, что это не то, как следует использовать Django. Не могли бы вы подсказать мне, как сделать это правильным способом в Django. Я думаю, что мне нужно использовать модели, но это внешняя база данных, и я не хочу ничего в нее писать. Я также не хочу определять все имена таблиц в моих моделях, но я сделаю это, если потребуется. Подскажите, пожалуйста, как мне поступить, чтобы база данных оставалась доступной только для чтения

Как мне структурировать settings.py, Как мне структурировать models.py, Как мне структурировать views.py, чтобы иметь возможность взаимодействовать с db?

import pyodbc
import pandas as pd

def SQL_to_df(driver,server,database,user,password,query):
    connectionString = pyodbc.connect(f"Driver={driver};Server{server};Database={database};UID={user};PWD={password};")
    df = pd.read_sql(query, connectionString)
    return df

Итак, я выяснил, как это сделать. В принципе, вы можете добавить внешнюю базу данных в файл настроек, и для того, чтобы не записывать в нее изменения, я использовал библиотеку django-db-readonly. Она предотвращает запись в любую базу данных, так что вот мой файл settings.py

#db read only setting
SITE_READ_ONLY = True
DB_READ_ONLY_DATABASES = ['external_db']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'external_db': {
        'ENGINE': 'mssql',
        'NAME': os.environ['DB_NAME'],
        'USER': os.environ['USER'],
        'PASSWORD': os.environ['PASSWD'],
        'HOST': os.environ['HOST'],
        'PORT': '1433',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'extra_params': 'Encrypt=no;TrustServerCertificate=yes;'
        }
    }
}

Затем в файле views.py вы можете сделать следующее, в моем случае я хотел получить результаты в виде фрейма данных pandas, но вы можете получить результаты SQL любым способом

from django.db import connections
import pandas as pd

query = "SELECT * FROM table"

with connections[external_db].cursor() as cursor:
        df = pd.read_sql(query, con=connections[external_db].connection)
Вернуться на верх