Вот подпись вызова для 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.
Так что execute ожидает максимум 3 аргумента (аргументы необязательны).
Если аргументы заданы, ожидается, что это будет последовательность.
так
sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(*sql_and_params)
не будет работать, потому что
cursor.execute(*sql_and_params)
расширяет кортеж sql_and_params на 4 аргумента (и снова выполняется только ожидает 3).
Если вы действительно должны использовать
sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
тогда вам придется разбить его на части при подаче на cursor.execute
:
cursor.execute(sql_and_params[0],sql_and_params[1:])
Но я думаю, что гораздо приятнее просто использовать две переменные:
sql = "INSERT INTO table VALUES (%s, %s, %s)"
args= var1, var2, var3
cursor.execute(sql, args)