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

Django中SQL查询request_id返回None问题求助

Django自定义SQL查询返回None问题排查与解决

核心问题总结

自定义SQL类在Django视图中查询request_id始终返回None,但单独运行test.py能正常获取结果;数据库已存储UUID生成的request_id,导致邮件链接中参数为None。


排查出的关键问题

  1. 执行顺序逻辑错误
    视图中先执行SQL查询,再判断表单有效性并保存数据。此时用户提交的表单数据还未写入数据库,自然查不到对应结果——单独运行test.py时查询的是已存在的数据,所以能正常返回。

  2. SQL语句拼接的语法风险
    用format拼接SQL时,若git_Id是字符串类型,未加引号会导致SQL语法错误,直接返回None。同时这种写法存在严重的SQL注入风险。

  3. 自定义SQL类的资源泄漏问题
    update_approval方法中创建数据库连接和游标后未关闭,长期运行可能导致连接池耗尽,引发后续查询异常。

  4. 类构造函数拼写错误
    test.py中的类构造函数写成了__int__,正确写法应为__init__(虽当前未影响功能,但属于不规范写法)。


修复方案

方案1:用Django原生ORM替代自定义SQL(推荐)

完全没必要自己写SQL查询,Django的ModelForm保存后会返回实例,直接从实例获取request_id最可靠:

def index(request):
    if request.method == "POST":
        form = InputForm(request.POST)
        if form.is_valid():
            # 先保存表单到数据库,获取保存后的实例
            saved_model = form.save()
            # 直接从实例中拿request_id
            request_id = saved_model.request_id
            approve_url = f"http://my_url_path/test?request_id={request_id}"
            
            send_mail(
                'KSA Test Activation',
                approve_url,
                'my_sender_email_id',
                ['receiver_id'],
                fail_silently=False,
            )
            form = InputForm()
    else:
        form = InputForm()
    return render(request, 'home.html', {'form': form})

方案2:修复自定义SQL查询(不推荐,仅作参考)

如果一定要保留自定义SQL类,需做以下修改:

  1. 修正构造函数

    class sql:
        def __init__(self):  # 把__int__改成__init__
            pass
    
  2. 改用参数化查询,关闭资源
    修改test.py的update_approval方法:

    def update_approval(self, git_id):
        d = self.mysql_connection()
        cursor = d.cursor()
        # 参数化查询,避免SQL注入和语法错误
        query = "SELECT request_id FROM request_form_db.request_form_mymodel where git_Id=%s"
        cursor.execute(query, (git_id,))
        result = cursor.fetchone()
        # 关闭游标和连接,避免资源泄漏
        cursor.close()
        d.close()
        # 有结果则返回第一个值,否则返回None
        return result[0] if result else None
    
  3. 调整视图中的执行顺序
    必须在表单保存后再执行查询:

    def index(request):
        if request.method == "POST":
            form = InputForm(request.POST)
            obj = sql()
            if form.is_valid():
                saved_model = form.save()
                # 用保存后的实例的git_Id查询
                p = obj.update_approval(saved_model.git_Id)
                approve_url = f"http://my_url_path/test?request_id={p}"
                
                send_mail(
                    'KSA Test Activation',
                    approve_url,
                    'my_sender_email_id',
                    ['receiver_id'],
                    fail_silently=False,
                )
                form = InputForm()
            print(p)
        else:
            form = InputForm()
        return render(request, 'home.html', {'form': form})
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:35:21