【问题标题】:Multiple parameters in MySQL "IN" queryMySQL“IN”查询中的多个参数
【发布时间】:2019-07-28 15:14:03
【问题描述】:

我显然在参数化中做错了什么,但不确定正确的语法是什么。

需要,但不起作用:IN 中的多个条件

data = ['lol', 'hi']
query = """ select word, count(1) from table where word in (%(ids)s) group by 1"""
pandas.read_sql_query(sql=query, con=db_engine, params={'ids':data})

输出:

InternalError: (pymysql.err.InternalError) (1241, 'Operand should contain 1 column(s)') [SQL: "select word, count(1) from table where word in (%(ids)s) group by 1 "] [parameters: {'ids': ('lol', 'hi')}]

不需要,但有效:IN 中的单一条件 (长度为 1 的列表也可以)

data = ['lol']
query = """ select word, count(1) from table where word in (%(ids)s) group by 1"""
pandas.read_sql_query(sql=query, con=db_engine, params={'ids':data})

【问题讨论】:

    标签: python mysql pandas sqlalchemy pymysql


    【解决方案1】:

    删除占位符周围的括号。因为它是在 pymysql 完成参数替换之后将word(('lol', 'hi')) 进行比较,或者换句话说,是针对元组的标量。长度为 1 的列表很好,因为结果是 (('hi')),并且 SQL 在比较时实际上将标量 word 视为 1 列行,这可能是稍微不明显的错误提示。

    所以查询应该是这样的:

    query = """
        select word, count(1)
        from table
        where word in %(ids)s
        group by 1
        """
    

    【讨论】:

    • 澄清一下,您的意思是删除query 中文本周围的括号(不是方括号),对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2015-11-17
    • 2014-11-15
    • 2021-03-15
    相关资源
    最近更新 更多