2

使用pandassqlite3后端,我可以param安全地提供用户提供的搜索值,ala:

In [66]: df = pd.DataFrame({"x":range(10), "y":range(10)})
# db is an existing pandas sqlite3 connection
In [67]: df.to_sql('df', rb.db)
In [68]: pd.read_sql_query("""SELECT y FROM df WHERE x = ?""", rb.db, params=(4,))
   y
0  4

问:有没有办法直接在DataFrame不将其转储到 sqlite 后端(无论是内存中还是文件支持)中进行操作?

类似于:

pandasql.sqldf("SELECT y FROM df WHERE x = ?", params=(4,), globals())

(显然,这不起作用)。列出的参数pandasql.sqldf不包括任何明显的东西,所以我猜我必须(a)创建一个临时的 sqlite3 内存缓存并针对它进行查询,或者(b)冒 SQL 注入的风险或手动对抗它。后者会使用类似的东西:

pandasql.sqldf("SELECT y FROM df WHERE x = {0}".format(*[ '"' + x + '"' for x in ['4'] ]), globals())

现在我正在动态创建“where”变量的列表,所以虽然它在WHERE x = ?这里,但它通常是多个变量和/或变量的多个命中,例如WHERE x like ? OR y like ? OR z > ?. 该字符串的创建很简单,并且比较值列表的创建同样“完成”;麻烦的是使用用户提供的搜索值。

与29501895不同的问题;因为我担心 SQL 注入,所以使用局部变量并不能解决问题。

4

0 回答 0