在 Django 中使用外部 SQL Server 数据库

问题描述 投票:0回答:1

我正在尝试创建一个连接到外部 SQL Server 数据库以仅检索信息(只读)的 Django 网站。这个数据库很大,有数百张表。

我目前可以通过在 Django 应用程序中创建一个函数来使其工作,该函数使用

connectionString
并运行原始 SQL 查询并在 pandas 数据框中返回它。

不知怎的,我觉得这不是 Django 应该使用的方式。您能指导我如何以正确的 Django 方式执行此操作吗?我想我需要使用模型?但这是一个外部数据库,我不想向其中写入任何内容。我也不想在我的模型中定义所有表名称,但如果必须的话我会这样做。您能否指导我如何解决此问题,同时确保数据库保持只读状态?

如何构建我的

settings.py
,如何构建我的
models.py
,如何构建我的
views.py
以便能够与数据库交互?

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
python sql-server django pyodbc
1个回答
0
投票

所以我想出了如何做到这一点。基本上,您可以在设置文件中添加外部数据库,为了确保我没有对其进行任何更改,我使用了一个名为 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)
© www.soinside.com 2019 - 2024. All rights reserved.