Django PostgreSQL默认项目中如何执行MSSQL原生SQL查询并打印结果
实现Django项目同时连接PostgreSQL与MSSQL执行查询的方案
步骤1:安装MSSQL连接依赖
首先安装Django连接MSSQL所需的库:
pip install django-mssql-backend pyodbc
如果是Linux部署环境,需要提前安装unixODBC和微软官方的MSSQL ODBC驱动。
步骤2:在配置中新增MSSQL数据库连接
修改settings.py中的DATABASES配置,在原有PostgreSQL配置的基础上新增MSSQL连接项:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'ALIAS': 'XX', 'USER': 'XX', 'PASSWORD': 'XX', 'HOST': 'XX', 'PORT': 'XX', }, # 新增MSSQL配置,别名自定义为mssql 'mssql': { 'ENGINE': 'sql_server.pyodbc', 'NAME': '你的MSSQL数据库名', 'USER': 'MSSQL用户名', 'PASSWORD': 'MSSQL密码', 'HOST': 'MSSQL服务器地址', 'PORT': '1433', # 默认端口可根据实际情况修改 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', # 驱动版本和你安装的一致即可 'extra_params': 'APP=DjangoMSSQLConn', } } }
新增的MSSQL连接和默认PostgreSQL连接完全独立,互不影响。
步骤3:执行MSSQL查询的核心代码
你可以直接在任意视图中通过Django的多数据库连接接口执行自定义SQL,以你给出的示例查询为例:
from django.db import connections def query_mssql(request): # 初始化结果变量 query_result = [] columns = [] if request.method == "POST": # 接收页面传入的查询语句,生产环境必须做校验和权限控制 query_sql = request.POST.get("sql", "") # 你给出的示例查询也可以直接写死在这里 # query_sql = "SELECT TOP(11) * FROM dbo.UserObject WITH (NOLOCK) WHERE u_logon_name=%s" with connections['mssql'].cursor() as cursor: # 参数化查询,不要直接拼接SQL字符串,防止注入 # 如果有查询参数,放在execute第二个参数的列表里 # cursor.execute(query_sql, ['cc@gmail.com']) cursor.execute(query_sql) # 获取查询结果的表头 columns = [col[0] for col in cursor.description] # 将结果转为字典格式,方便模板遍历 query_result = [dict(zip(columns, row)) for row in cursor.fetchall()] return render(request, "你的模板文件名.html", {"columns": columns, "query_result": query_result})
步骤4:模板中展示查询结果
在模板文件中添加表单和结果展示区域:
<!-- 输入SQL的表单 --> <form method="post"> {% csrf_token %} <textarea name="sql" rows="8" cols="100" placeholder="输入MSSQL查询语句"></textarea> <br> <button type="submit">执行查询</button> </form> <!-- 展示查询结果 --> {% if query_result %} <h3>查询结果</h3> <table border="1" cellpadding="5" cellspacing="0"> <tr> {% for col in columns %} <th>{{ col }}</th> {% endfor %} </tr> {% for row in query_result %} <tr> {% for val in row.values %} <td>{{ val }}</td> {% endfor %} </tr> {% endfor %} </table> {% endif %}
注意事项
- 绝对禁止直接拼接用户输入的SQL内容,必须使用参数化查询传递查询条件,避免SQL注入风险
- 生产环境必须严格限制该功能的使用权限,仅开放给可信的管理员用户
- 可以给查询添加超时限制,避免慢查询影响MSSQL服务正常运行
内容的提问来源于stack exchange,提问作者tcblue
相关产品推荐
相关产品推荐

