首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在pandas python中的read_sql“where in”子句中传递元组

如何在pandas python中的read_sql“where in”子句中传递元组
EN

Stack Overflow用户
提问于 2017-09-04 22:45:32
回答 2查看 5.7K关注 0票数 4

我将read_sql方法中转换为字符串的元组作为

代码语言:javascript
复制
sql = "select * from table1 where col1 in " + str(tuple1) + " and col2 in " + str(tuple2)

df = pd.read_sql(sql, conn)

这可以很好地工作,但是,当元组只有一个值时,sql会失败,返回ORA-00936: missing expression,因为单个元素元组有一个额外的逗号

例如

代码语言:javascript
复制
tuple1 = (4011,)
tuple2 = (23,24)

形成的sql格式为

代码语言:javascript
复制
select * from table1 where col1 in (4011,) + " and col2 in (23,24)
                                        ^
ORA-00936: missing expression

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-09-04 23:17:47

可能有一种更好的方法,但我会在执行查询时添加一条if语句,并使用.format()而不是+来参数化查询。

可能的if语句:

代码语言:javascript
复制
if len(tuple1) < 2:
    tuple1 = tuple1[0]

这将根据您的输入内容而有所不同。如果你有一个元组列表,你可以这样做:

代码语言:javascript
复制
tuples = [(4011,), (23, 24)]
new_t = []
for t in tuples:
    if len(t) == 2:
         new_t.append(t)
    elif len(t) == 1:
         new_t.append(t[0])

输出:

代码语言:javascript
复制
[4011, (23, 24)]

使用.format()参数化查询的更好方法

代码语言:javascript
复制
sql = "select * from table1 where col1 in {} and col2 in {}".format(str(tuple1), str(tuple2))

希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2017-09-05 18:31:47

出现这个错误的原因是因为SQL语法。

当您有一个WHERE col in (...)列表时,后面的逗号将导致语法错误。

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

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

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

此功能在pd.read_sql中也是公开的,因此要安全地获得您想要的内容,您可以这样做:

代码语言:javascript
复制
sql = "select * from table1 where col1 in %s and col2 in %s"

df = pd.read_sql(sql, conn, params = [tuple1, tuple2])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46039492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档