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

a3n*_*3nm 2 python sql sqlite code-injection prepared-statement

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)
Run Code Online (Sandbox Code Playgroud)

麻烦的是,我不想执行查询,我只是想格式化它并将查询作为字符串.我想我可以自己逃避,但这不是一个非常优雅的解决方案.必须有一种方法来获取格式化的查询,而无需实际连接到数据库并运行它们.

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

S.L*_*ott 5

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

并不是的.

RDBMS在内部处理"准备好的查询"和"绑定变量"."格式化"实际上并不存在.无处不在.

  • 糟糕,我根本不知道这个,我以为这只是一个方便的逃跑方法。事实证明,这个问题是无关紧要的。今天我学到了新东西。:-) 如果其他人对此感到困惑,请参阅:https://secure.wikimedia.org/wikipedia/en/wiki/Prepared_statement (2认同)