Как передать кортеж с одним элементом в качестве параметра в 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)