Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySql cursors.execute() avec un seul paramètre :pourquoi une chaîne est-elle découpée en une liste ?

Le problème est que ('hello') est une chaîne et ('hello',) est un uplet . Vous devez toujours passer un tuple (ou une autre collection de ce type, comme une liste) comme valeurs pour vos espaces réservés. La raison en est que vos espaces réservés sont positionnels dans votre requête, les arguments doivent donc également avoir un certain ordre - et les tuples et les listes sont deux façons d'obtenir une sélection ordonnée d'objets.

Depuis qu'il attend un tuple ou une autre collection, 106 est converti en [1, 0, 6] . Si vous transmettez (106,) , il sera interprété correctement.

Dans les coulisses, voici ce qui se passe :

>>> for i in '106':
...     print(i)
...
1
0
6
>>> for i in ('106',):
...    print(i)
...
106

Donc, votre "hack" est en fait la bonne solution, vous n'avez simplement pas besoin de la variable supplémentaire :

q = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s'
cursor.execute(q, (idProduct,))