我在 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])
我是一名优秀的程序员,十分优秀!