背景:

使用django raw 直行sql语句时遇到错误如下:

  File "D:\software\python3.8\lib\site-packages\django\db\models\query.py", line 1463, in __iter__
    self._fetch_all()
  File "D:\software\python3.8\lib\site-packages\django\db\models\query.py", line 1450, in _fetch_all
    self._result_cache = list(self.iterator())
  File "D:\software\python3.8\lib\site-packages\django\db\models\query.py", line 1473, in iterator
    query = iter(self.query)
  File "D:\software\python3.8\lib\site-packages\django\db\models\sql\query.py", line 99, in __iter__
    self._execute_query()
  File "D:\software\python3.8\lib\site-packages\django\db\models\sql\query.py", line 133, in _execute_query
    self.cursor.execute(self.sql, params)
  File "D:\software\python3.8\lib\site-packages\django\db\backends\utils.py", line 98, in execute
    return super().execute(sql, params)
  File "D:\software\python3.8\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "D:\software\python3.8\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\software\python3.8\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\software\python3.8\lib\site-packages\django\db\backends\mysql\base.py", line 73, in execute
    return self.cursor.execute(query, args)
  File "D:\software\python3.8\lib\site-packages\pymysql\cursors.py", line 168, in execute
    query = self.mogrify(query, args)
  File "D:\software\python3.8\lib\site-packages\pymysql\cursors.py", line 147, in mogrify
    query = query % self._escape_args(args, conn)
TypeError: not enough arguments for format string

代码是:

sql = f"""        
    SELECT bp.id,
        bp.obj_key,
        bp.obj_name,
        bp.system_number,
        bp.intersection_key as node_key,
        DATE_FORMAT(bp.execution_stime,'%Y-%m-%d %H:%i:%S') AS execution_stime,
        DATE_FORMAT(bp.execution_etime,'%Y-%m-%d %H:%i:%S') AS execution_etime,
        bi.obj_name as node_name FROM bprogram as bp
    JOIN bintersection as bi 
    on bp.intersection_key=bi.obj_key
    WHERE hash_code in {tuple(hash_code_li)}
"""

program_li = ProgramModel.objects.raw(sql)

原因:

原始 SQL 是一个带有格式化参数的字符串,这意味着 % 表示要格式化的参数。sql字符串中有 % 。因此需要将它们保护免受格式化:

sql = f"""        
    SELECT bp.id,
        bp.obj_key,
        bp.obj_name,
        bp.system_number,
        bp.intersection_key as node_key,
        DATE_FORMAT(bp.execution_stime,'%%Y-%%m-%%d %%H:%%i:%%S') AS execution_stime,
        DATE_FORMAT(bp.execution_etime,'%%Y-%%m-%%d %%H:%%i:%%S') AS execution_etime,
        bi.obj_name as node_name FROM bprogram as bp
    JOIN bintersection as bi 
    on bp.intersection_key=bi.obj_key
    WHERE hash_code in {tuple(hash_code_li)}
"""

program_li = ProgramModel.objects.raw(sql)


本文地址: http://chenxm.cc/article/1307.html
版权声明: 本文为原创文章,版权归  陈新明  所有,欢迎分享本文,转载请保留出处!
上一篇: django queryset中datetile字段转换成日期格式
下一篇: selenium读取、添加、删除cookie
发表评论

还没有留言,还不快点抢沙发?