MySql cursors.execute () con un solo parámetro: ¿Por qué una cadena se divide en una lista?

Status quo:

Tengo una base de datos de trabajo con tablas y puedo consultar, insertar, actualizar, etc. También el cursor está conectado a la base de datos correcta.

La mesa:

captura de pantalla del resultado de la consulta

Problema:

Cuando se trata de consultar datos de una tabla, me encuentro con problemas:

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

Durante la depuración, tengo un vistazo a la función cursor.execute (): params = str: 106 pasará a:

 stmt = operation % self._process_params(params) 

dónde

 res = params # pylint: disable=W0141 res = map(self._connection.converter.to_mysql, res) 

Se llama con res = str: 106 . No estoy seguro de qué está haciendo el convertidor, pero como resultado res = list: ['1', '0', '6'] . Y estos argumentos se pasarán a la función de ejecución que se ejecutará en el siguiente error:

 File "C:\Python27\lib\site-packages\mysql\connector\cursor.py", line 480, in execute "Wrong number of arguments during string formatting") mysql.connector.errors.ProgrammingError: Wrong number of arguments during string formatting 

Mala solución:

Tengo una solución sucia, pero no estoy contento con ella. Puede que no funcione en algunos casos:

 query = 'SELECT Last_Request_Time FROM Products WHERE idProduct = %s AND Edition != %s' idProduct = '106' cursor.execute(query, (idProduct, 'A')) 

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 algún orden, y las tuplas y las listas son dos formas de obtener una selección ordenada de objetos.

Como se espera una tupla u otra colección, 106 se convierte a [1, 0, 6] . Si pasa en (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 ‘hack’ 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,))