¿Cómo colocar una consulta de SQL parametrizada en una variable y luego ejecutarla en Python?

Entiendo que la forma correcta de formatear una consulta de SQL en Python es así:

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3) 

para que impida la inyección de sql. Mi pregunta es si hay una manera de poner la consulta en una variable y luego ejecutarla. He intentado el siguiente ejemplo pero recibo un error. ¿Es posible hacer esto?

 sql="INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 cursor.execute(sql) 

Aquí está la firma de la llamada para cursor.execute:

 Definition: cursor.execute(self, query, args=None) query -- string, query to execute on server args -- optional sequence or mapping, parameters to use with query. 

Así que ejecute espera a lo sumo 3 argumentos (args es opcional). Si se da args, se espera que sea una secuencia. asi que

 sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 cursor.execute(*sql_and_params) 

no va a funcionar, porque

 cursor.execute(*sql_and_params) 

expande la tupla sql_and_params en 4 argumentos (y de nuevo, ejecute solo espera 3).

Si realmente debes usar

 sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 

entonces tendrá que separarlo cuando lo alimente a cursor.execute :

 cursor.execute(sql_and_params[0],sql_and_params[1:]) 

Pero creo que es mucho más agradable usar solo dos variables:

 sql = "INSERT INTO table VALUES (%s, %s, %s)" args= var1, var2, var3 cursor.execute(sql, args) 

Estas bastante cerca

 sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3 cursor.execute(*sql_and_params) 

El asterisco significa que la variable no debe considerarse como un solo parámetro, sino que debe descomprimirse en muchos parámetros.

Usted podría intentar esto:

 sql="INSERT INTO table VALUES (%s, %s, %s)" cursor.execute(sql, var1, var2, var3) 

Pero no estoy seguro de si eso es lo que estás buscando. Depende de si desea que los valores formen parte de la variable o no. Si lo haces, la respuesta de Ants Aasma es probablemente correcta.