在Python中格式化SQL查询而不执行它

在Python中格式化SQL查询而不执行它,python,sql,sqlite,prepared-statement,code-injection,Python,Sql,Sqlite,Prepared Statement,Code Injection,Python有各种各样的库与数据库接口,这为构建SQL查询提供了一种很好的方法,而不用担心SQL注入。例如,使用sqlite3: for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ]: c.execut

Python有各种各样的库与数据库接口,这为构建SQL查询提供了一种很好的方法,而不用担心SQL注入。例如,使用sqlite3:

for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)
问题是,我不想执行查询,我只想格式化它并将查询作为字符串。我想我自己可以逃避,但这不是一个非常优雅的解决方案。必须有一种方法来获取格式化查询,而不必实际连接到数据库并运行它们

(上下文是我正在编写一个过滤器,它从输入中准备一系列SQL语句,但我不想在特定数据库上运行它们,只想保存它们以备将来使用。)

必须有一种方法来获取格式化查询,而不必实际连接到数据库并运行它们

不是真的


RDBMS通过“准备好的查询”和“绑定变量”在内部处理这个问题。“格式化”实际上并不存在。任何地方。

我不相信Python会这么做。。。使用参数的能力不是在驱动程序级别处理的吗?i、 例如,我会使用ASP.Net或Java中完全相同的SQL代码与数据库对话。Woops,我根本不知道这一点,我认为这只是处理转义的一种方便方式。事实证明,这个问题无关紧要;今天我学到了一些新东西。:-)如果其他人对此感到困惑,请参阅: