Как передать кортеж с одним элементом в качестве параметра в sql-запросе Python?

Как передать кортеж с одним элементом в качестве параметра в sql-запросе Python?

Я пробовал это решение, предложенное здесь: имплодинг списка для использования в предложении IN MySQLDB в python

ids = [(UUID('1232a4df-5849-46c2-8c76-74fe74168d82'),)] # list of ids
cursor.execute('''
SELECT 
...
WHERE
  id IN %(ids)s
  AND created_at > %(start_dt)s
''', {
  'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
})

но это решение не работает в python 3 и mysql-connector-python 8.0.21. Я получаю эту ошибку:

An error "Python tuple cannot be converted to MySQL type" is returned.

Я не думаю, что то, что вы пытаетесь сделать, возможно в версии Python3 коннектора MySQL. Код преобразует значения Python dict в синтаксис SQL, в зависимости от типа Python. Но в коде коннектора поддерживаются только скалярные типы, никаких списков или кортежей. См. https://github.com/mysql/mysql-connector-python/blob/master/lib/mysql/connector/conversion.py#L221-L372

Я бы использовал решение из принятого ответа на имплодинг списка для использования в python MySQLDB IN clause, которое заключается в создании N заполнителей для количества элементов в вашем списке, плюс еще один заполнитель для значения для сравнения с created_at. Затем объедините список со значением даты и передайте его.

ids = ['1232a4df-5849-46c2-8c76-74fe74168d82'] # list of ids
id_placeholders = ','.join(['%s'] * len(ids))
query = f'''
SELECT *
FROM mytable
WHERE
  id IN ({id_placeholders})
  AND created_at > %s
'''

params = ids
params.append('2019-10-31 00:00:00')

cursor.execute(query, params)
Вернуться на верх