使用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注入,使用局部变量并不能解决问题。