El problema es que ('hello')
es una cadena y ('hello',)
es una tupla . Siempre debe pasar una tupla (u otra colección similar, como una lista) como valores para sus marcadores de posición. La razón es que sus marcadores de posición son posicionales en su consulta, por lo que los argumentos también deben tener cierto orden, y las tuplas y las listas son dos formas de obtener una selección ordenada de objetos.
Dado que espera una tupla u otra colección, 106
se convierte en [1, 0, 6]
. Si pasa (106,)
, se interpretará correctamente.
Detrás de escena, esto es lo que está pasando:
>>> for i in '106':
... print(i)
...
1
0
6
>>> for i in ('106',):
... print(i)
...
106
Entonces, su 'truco' es en realidad la solución correcta, simplemente no necesita la variable adicional:
q = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
cursor.execute(q, (idProduct,))