I miei saluti.
Anche se un po' prematuramente, ho cominciato a vedere qualcosa dei db in python e quasi immediatamente mi sono imbattuto nella pep 249, "Python Database API Specification 2.0", che definisce le specifiche cui devono attenersi i drivers python per le varie basi dati.
Pur se penso che lo OP abbia ormai risolto la sua ultima domanda (cui ho risposto in maniera scherzosa), nel leggere la docs ho visto un particolare secondo me pertinente con la discussione che penso sia il caso di segnalare, altri apprendisti come me potrebbero giovarsene.
Il "particolare" è che un oggetto "cursor"
deve esporre dei dati descrittivi del result-set definito dalla query ... a prima vista, ciò "non sembra" particolarmente indicativo, infatti esso espone una serie di tuple contenenti, tra l'altro, il nome della colonna ovvero la funzione applicata su di una colonna, sotto un esempio relativo alla query di interrogazione di base a questo post :
>>> curr = conn.cursor()
>>> curr.execute("""
SELECT nome, SUM(val1), SUM(val2), SUM(val3)
FROM totascio
GROUP BY nome
""")
>>> c_data = curr.description
>>> c_data
(Column(name='nome', type_code=1043, display_size=None, internal_size=10, precision=None, scale=None, null_ok=None), Column(name='sum', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None), Column(name='sum', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None), Column(name='sum', type_code=20, display_size=None, internal_size=8, precision=None, scale=None, null_ok=None))
vi è però l'istruzione sql "AS" che ci permette di denominare "diversamente" un dato od una aggregazione di dati restituita, supposto di voler denominare le somme delle colonne in esempio quali "somma_1 ... somma_n" potremmo porre la query
>>> curr.execute("""
SELECT nome, SUM(val1) AS somma_1, SUM(val2) AS somma_2, SUM(val3) AS somma_3
FROM totascio
GROUP BY nome
""")
una tale query ci permetterebbe di estrarre la descrizione "come vorremmo" che sia definita, in maniera semplice
>>> tv_data = curr.description
>>> c_name = []
>>> for elem in tv_data:
c_name.append(elem[0])
>>> c_name
['nome', 'somma_1', 'somma_2', 'somma_3']
la qual cosa permetterebbe, appoggiandosi ad una variabile intermedia, p.e. una lista, di definire le "tuple" richieste dallo OP
>>> my_data = []
>>> for row in curr.fetchall():
nome, uno, due, tre = row
r_data = [nome, (c_name[1], uno), (c_name[2], due), (c_name[3], tre)]
my_data.append(r_data)
>>> for elem in my_data:
print(elem)
['pippo', ('somma_1', 13), ('somma_2', 12), ('somma_3', 13)]
['ciccio', ('somma_1', 2), ('somma_2', 1), ('somma_3', 10)]
['nino', ('somma_1', 4), ('somma_2', 2), ('somma_3', 1)]
>>>
... certamente si può far di meglio (agli esperti battere il colpo) ma mi sembra un metodo "pratico" per il risultato voluto, oltre quello di definire manualmente dati che si conoscono già, non credo sia il caso di andarsi ad esaminare il "vocabolario" di un db con metodi specifici.
Personalmente, vedo cursor.description utile per eventuali intestazioni di visualizzazioni tabellari dei dati.