Несколько параметров в запросе "IN" MySQL - PullRequest
0 голосов
/ 06 марта 2019

Я явно что-то не так делаю в параметризации, но не уверен, каков правильный синтаксис.

Желательно, но не работает: несколько условий, в которых 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})

1 Ответ

1 голос
/ 06 марта 2019

Снимите скобки вокруг заполнителя. Так как запрос сравнивает word с (('lol', 'hi')) после подстановки параметра, выполненного pymysql, или, другими словами, скаляром против кортежа. Список длины 1 хорош, потому что результат равен (('hi')), а SQL фактически сравнивает скаляр word как строку из 1 столбца при сравнении, на что, возможно, слегка неочевидная ошибка намекает.

Таким образом, запрос должен выглядеть так:

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