Problemet är att ('hello')
är en sträng och ('hello',)
är en tuppel . Du måste alltid skicka en tupel (eller annan sådan samling, som en lista) som värden för dina platshållare. Anledningen är att dina platshållare är positionella i din fråga, så argumenten bör också ha en viss ordning - och tupler och listor är två sätt att få ett ordnat urval av objekt.
Eftersom det väntar en tuppel eller annan samling, 106
konverteras till [1, 0, 6]
. Om du skickar in (106,)
, kommer det att tolkas korrekt.
Bakom kulisserna är det här vad som händer:
>>> for i in '106':
... print(i)
...
1
0
6
>>> for i in ('106',):
... print(i)
...
106
Så ditt "hack" är faktiskt den korrekta lösningen, du behöver bara inte den extra variabeln:
q = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
cursor.execute(q, (idProduct,))