You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django模板展示自定义SQL结果遇AttributeError及数据返回问题

让我们一步步解决你的问题:

第一个问题:修复AttributeError: module 'django.http.request' has no attribute 'META'

这个错误的核心原因是你的视图函数参数写错了:你定义的是def mycustomsql(self):,但Django的函数视图第一个参数必须是**request**(HttpRequest对象),而不是self(self是类视图里的实例参数)。

更关键的是,你在函数里直接使用了request变量,但这个变量并没有被正确传入——大概率你是不小心导入了django.http.request模块(而非获取请求对象),导致模板上下文处理器尝试访问模块的META属性,自然会报错。

解决方法很简单:把视图函数的参数从self改成request,确保函数能拿到正确的HttpRequest对象。


第二个问题:修复仅返回一行差异的逻辑

你当前的代码中,rs变量在每次循环都会被覆盖,最后只会保留最后一个差异项。要收集所有差异,你需要初始化一个列表,把每个差异项添加进去,而不是每次覆盖。

另外,建议用with语句来管理数据库连接和游标,避免连接泄漏;同时处理查询结果为空或长度不一致的情况,防止索引越界。


修正后的完整代码

from django.shortcuts import render
import cx_Oracle

def mycustomsql(request):  # 这里把self改成request
    differences = []  # 初始化列表收集所有差异
    try:
        # 使用with管理连接和游标,自动关闭资源
        with cx_Oracle.connect('hr/passwd@127.0.0.1/xe') as conn:
            with conn.cursor() as cursor1:
                cursor1.execute("SELECT p.name,p.value FROM v$parameter p ORDER BY p.name")
                results1 = cursor1.fetchall()
            with conn.cursor() as cursor2:
                cursor2.execute("SELECT p.name,p.value FROM v_param p ORDER BY p.name")
                results2 = cursor2.fetchall()
        
        # 用zip遍历两个结果集,避免索引越界问题
        for res1, res2 in zip(results1, results2):
            if res1 != res2:
                # 按照你的预期格式组装每一行内容
                diff_item = f"localhost/xe - {res1} : localhost/xe - {res2}"
                differences.append(diff_item)
        
        # 处理结果集长度不一致的情况
        if len(results1) != len(results2):
            differences.append("⚠️ 两个查询结果的行数不一致,部分数据未对比")
    except cx_Oracle.Error as e:
        # 捕获数据库错误,方便排查问题
        differences.append(f"数据库查询出错: {str(e)}")
    
    # 把差异列表传给模板
    context = {"object_list": differences}
    return render(request, "Blog/param.html", context)

模板(Blog/param.html)编写

在模板里循环object_list,输出每一行差异:

{% if object_list %}
    {% for item in object_list %}
        <p>{{ item }}</p>
    {% endfor %}
{% else %}
    <p>没有找到任何差异</p>
{% endif %}

这样就能实现你的预期输出效果:

localhost/xe - ('shared_pool_size', '0') : localhost/xe - ('shared_pool_size', '5')
localhost/xe - ('streams_pool_size', '0') : localhost/xe - ('streams_pool_size', '8')

内容的提问来源于stack exchange,提问作者OTT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:15:45