我正在尝试创建一个连接到外部 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
所以我想出了如何做到这一点。基本上,您可以在设置文件中添加外部数据库,为了确保我没有对其进行任何更改,我使用了一个名为 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)