在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
相关产品推荐
相关产品推荐

