背景:
使用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)
还没有留言,还不快点抢沙发?