Domanda

Se Newdata è elenco di colonne x, come otterrebbe il numero colonne univoche - numero dei membri della prima tupla. (Len non è importante.) Cambiare il numero di "?" per abbinare le colonne e l'inserto utilizzando l'istruzione di seguito.

csr = con.cursor()
csr.execute('Truncate table test.data')
csr.executemany('INSERT INTO test.data VALUES (?,?,?,?)', Newdata)
con.commit()
È stato utile?

Soluzione

Con il termine "Newdata è elenco di colonne x", immagino si x media tuple , da allora si continua a parlare di "prima tupla". Se Newdata è una lista di tuple, y = len(Newdata[0]) è il numero di elementi nella prima una di quelle tuple.

Supponendo che è il numero che si desidera (e tutte le tuple era meglio avere lo stesso numero di elementi, altrimenti executemany fallire!), L'idea generale di @ risposta di Nathan ha ragione: costruire la stringa con il numero appropriato di punti interrogativi separati da virgole:

holders = ','.join('?' * y)

poi inserirlo nel resto della istruzione SQL. @ Modo di Nathan per inserto è giusto per la maggior parte delle versioni 2.any Python, ma se avete 2.6 o meglio,

sql = 'INSERT INTO testdata VALUES({0})'.format(holders)

è attualmente preferita (funziona anche in Python 3.any).

Infine,

csr.executemany(sql, Newdata)

farà ciò che desideri. Ricordarsi di commit della transazione una volta che il gioco è fatto! -)

Altri suggerimenti

Se stai cercando per il numero massimo di elementi in tutti gli elementi in Newdata, è semplicemente:

num_columns = max(len(t) for t in Newdata)

Questo, naturalmente, presuppone pitone 2,5 o superiore.

Non è che io sono sicuro di quello che stai tentando avrebbe funzionato, ma la dichiarazione dell'inserto diventerebbe:

sql = "INSERT INTO VALORI test.data (% s)" % "". Join ( '?' * Num_colonne)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top