使用pandas
和sqlite3
后端,我可以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 注入,所以使用局部变量并不能解决问题。