Проблемът е, че ('hello')
е низ и ('hello',)
е кортежка . Винаги трябва да предавате кортеж (или друга подобна колекция, като списък) като стойности за вашите заместители. Причината е, че вашите заместители са позиционни във вашата заявка, така че аргументите също трябва да имат някакъв ред - а кортежите и списъците са два начина да получите подредена селекция от обекти.
Тъй като очаква кортеж или друга колекция, 106
се преобразува в [1, 0, 6]
. Ако подадете (106,)
, ще бъде интерпретирано правилно.
Зад кулисите се случва това:
>>> for i in '106':
... print(i)
...
1
0
6
>>> for i in ('106',):
... print(i)
...
106
Така че вашият "хак" всъщност е правилното решение, просто нямате нужда от допълнителната променлива:
q = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
cursor.execute(q, (idProduct,))