如何在 python 中安全地转换 SQL 占位符?

How to safely convert SQL placeholders in python?

总结/TLDR:

我如何安全地(没有 空间进行 sql 注射)转换 sql 占位符? 像 make SELECT * FROM go from SELECT * FROM ? (正则表达式替换适用于模式 $\d{1,} 但它有非常明显的缺陷,比如捕获用引号括起来的文字值) 反之亦然,从 SELECT * FROM ?SELECT * FROM

也很有帮助


我想做什么:

我有一个缓慢的 IO 绑定 postgres 连接,它很慢并且想要一个缓存系统,我希望这个缓存接受 sql 并提供输出,所以我决定克隆整个远程数据库并将其转换为本地磁盘 bount sqlite3 space 每次我的应用程序启动时它都充当“缓存”(我预计这会比 redis 更快,因为在本地有一些东西比不会更快)

我正在使用 asyncpg 与远程数据库进行交互,此模块接受 $n 占位符(其中 n 表示从 1 开始的占位符数量)

并使用 sqlite3,它使用 ? 作为值的占位符,并希望使用单个查询并在这两者之间进行转换。


如前所述,我尝试使用正则表达式和字符串模板,但它们不够安全,是否有内置于 asyncpgsqlite3 本身的方法?

SQLite on parameters 的文档提到了两个要点:

Named parameters are also numbered

...

A dollar-sign followed by an identifier name also holds a spot for a named parameter with the name $AAAA

换句话说,您可以在 SQLite 中使用来自 PostgreSQL 的 SELECT * FROM foo WHERE bar = 查询,反之亦然。

这并不是说所有可能的查询都是可以互换的,它们当然不是,但在这种情况下,您可以限制查询以对参数使用 样式语法并传递它们未修改。