Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLite如何获取正在执行的SQL字符串语句_Python_Sql_Sqlite - Fatal编程技术网

Python SQLite如何获取正在执行的SQL字符串语句

Python SQLite如何获取正在执行的SQL字符串语句,python,sql,sqlite,Python,Sql,Sqlite,假设我们有一个SQL语句,在对DB执行之前只需要使用参数完成它。例如: sql = ''' SELECT id, price, date_out FROM sold_items WHERE date_out BETWEEN ? AND ? ''' database_cursor.execute(sql, (start_date, end_date)) 如何获取解析和执行的字符串?类似于以下内容: SELECT id, price, date

假设我们有一个SQL语句,在对DB执行之前只需要使用参数完成它。例如:

sql = '''
      SELECT  id, price, date_out
      FROM sold_items
      WHERE date_out BETWEEN ? AND ?
      '''

database_cursor.execute(sql, (start_date, end_date))
如何获取解析和执行的字符串?类似于以下内容:

SELECT  id, price, date_out
FROM sold_items
WHERE date_out BETWEEN 2010-12-05 AND 2011-12-01
在这个简单的例子中,这不是很重要,但是我有其他更复杂的SQL语句,为了调试的目的,我希望自己在sqlite管理器中执行它们并检查结果


提前感谢

SQLite实际上从未将参数替换为SQL查询字符串本身;参数值在执行命令时直接读取。 格式化这些值只是为了再次将它们解析为相同的值,这将是无用的开销

但是,如果您想了解如何在SQL中编写参数,可以使用;大概是这样的:

SELECT  id, price, date_out
FROM sold_items
WHERE date_out BETWEEN 2010-12-05 AND 2011-12-01
进口稀土 def log_和_executecursor,sql,*参数: s=sql 如果lenargs>0: 生成选择报价,报价。。。 cursor.executeSELECT+,.join[args中i的引号],args quoted_values=cursor.fetchone 对于引用值中的引用值: s=s。替换“?”,引用_值,1 s=re.subr'values\|,|=\?',r'\g'+引号中的值,s,1 打印SQL命令:+s cursor.executesql,args
如果存在错误,此代码将失败?这不是一个参数,即在一个文本字符串中。除非您使用re.sub版本,否则哪个版本将只匹配?在“值”、“值”或“=”之后。“\g”将文本放回文本前?使用“\g”可以避免与以数字开头的带引号的值发生冲突。

字符串格式如何

sql = """
  SELECT  id, price, date_out
  FROM sold_items
  WHERE date_out BETWEEN {0} AND {1} """.format(start_date, end_date)
  """
database_cursor.execute(sql)
更新。我从中了解到,自Python 3.3以来,您可以使用

connection.set_trace_callback(print)
如果要恢复到静默处理,请使用

connection.set_trace_callback(None)

您可以使用另一个函数而不是print。

我编写了一个函数,该函数仅用参数填充问号

奇怪的是,每个人都向您发送使用位置参数的指令,但没有人考虑到需要记录、预览或检查查询的整体

无论如何,下面的代码假定

查询中没有不用作位置参数标记的“?”标记。我不确定情况是否总是这样。 参数的值将用引号括起来。例如,当您使用参数作为表名时,情况并非如此。不过,这种用例不太可能。 def compile_queryquery,*参数: 测试“?”标记和给定参数的数量是否不匹配 问号的数量=查询.计数'?' 参数的数量=lenargs 如果没有提供参数,则传递一个空元组 如果lenargs==1而不是args[0]: 参数的数量=0 如果参数的个数为!=问号的数量: 返回所提供绑定的正确数量。当前语句使用{number\u of_question\u marks},并且提供了{number\u of_arguments}。 编译查询 对于args中的a: query=query.替换“?”,“+stra+”,1 返回查询 建议用法

query=插入用户名、密码值? 敏感查询,出于安全考虑,我们需要对此进行记录 query\u string=编译\u查询查询、用户名、密码\u散列 花式日志函数查询字符串 处决 cursor.executequery、用户名、密码\u哈希
您不想自己构建字符串的具体原因是什么?我在某个地方读到,使用替换方法更好。不记得为什么了。据说,担心的是SQL注入。我猜如果你想调试你的查询,它还没有投入生产,那么你真的需要担心吗?这是保存搜索:sql注入,在某些情况下,数据库可以使用其他参数重用查询,而它必须使用全新的查询做更多的工作。我猜它还添加了。。。当需要的时候,为字符串。事实上,我希望避免在以后的生产中重新分解代码。此外,正如Argeman所指出的,在某些情况下,将查询的结构和数据分开是很有意思的。看起来像我想要的,但我没有真正让它工作?也许是一个更具体的例子?提前感谢代码段中有一个错误,行应该是:cursor.executeSELECT+,.join[quote for i in args],args这是我想要避免的。谢谢你的评论。