python - 如何在 pandas python 的 read_sql 'where in' 子句中传递元组

标签 python sql oracle pandas

我在 read_sql 方法中传递一个转换为字符串的元组作为

sql = "select * from table1 where col1 in " + str(tuple1) + " and col2 in " + str(tuple2)

df = pd.read_sql(sql, conn)

这工作正常,但是,当元组只有一个值时,sql 失败并显示 ORA-00936:缺少表达式,因为单个元素元组有一个额外的逗号

例如

tuple1 = (4011,)
tuple2 = (23,24)

形成的sql如下

select * from table1 where col1 in (4011,) + " and col2 in (23,24)
                                        ^
ORA-00936: missing expression

除了用字符串操作删除逗号之外,还有什么更好的方法吗?

有没有更好的方法来参数化 read_sql 函数?

最佳答案

您收到错误的原因是 SQL 语法。

当你有一个 WHERE col in (...) 列表时,尾随逗号会导致语法错误。

无论哪种方式,使用字符串连接将值放入 SQL 语句都是不受欢迎的,并且最终会导致您遇到更多问题。

大多数 Python SQL 库都允许参数化查询。在不知道您使用哪个库进行连接的情况下,我无法链接确切的文档,但是 psycopg2 的原理是相同的:

http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

此功能也在 pd.read_sql 中公开,因此要安全地实现您想要的,您可以这样做:

sql = "select * from table1 where col1 in %s and col2 in %s"

df = pd.read_sql(sql, conn, params = [tuple1, tuple2])

关于python - 如何在 pandas python 的 read_sql 'where in' 子句中传递元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46039492/

相关文章:

python - 在 YUV 叠加上绘制透明矩形

sql - 查找列中出现在 "every"类别中的元素

sql - 如何在没有结果的情况下返回查询结果

sql - 如何摆脱这些子选择?

java - Android 公共(public) SOAP 调用私有(private) Web 服务器

sql - SQL 连接如何工作?

python - Tensorflow while_loop如何返回所有中间值?

python - 在 python 中运行 xmlrunner 时没有打印到标准输出

python json模块导入错误

MySQL,排序 GROUP BY