<div dir="ltr"><div><div><div><div><div><div><div><div><div>dopo il talk di Alex su codice pythonico/idiomatico...<br></div>beh, non posso lasciar passare il seguente caso senza chiedervi un opinione<br></div><div><br></div>dunque il caso è questo<br></div>ho un file Excel xlsx con righe da caricare una a una su DB<br><br></div><div>non consigliatemi di utilizzare un ETL, perchè non è questo il punto<br></div><div>ah, a proposito, ho scoperto che per mangeggiare i file xlsx, openpyxl va alla grande<br></div><div><br></div><div>tornando a noi...<br></div>la prima riga dell'xlsx è un intestazione che stabilisce i nomi dele colonne<br><br></div>avevo chiesto che usassero i nomi uno a uno con i nomi dei campi su db.<br>ma, no, sarebbe stato troppo semplice e logico, per cui i nomi sono a dir poco fantasiosi e volatili<br><br></div><div>Indi per cui ho un dict che rimappa nomi-colonne-xlsx con nomi-campi-db<br><br></div><div>XLSX_COLUMN_NAMES = {<br></div><div>    'IL nome' : 'name',<br></div><div>    'RIFERIMENTO a GIGIO': 'gigio_id',<br>}<br></div><div><br></div>il piano per il caricamento dati è il seguente: iterare sulle righe dell'xlsx, costruire un kwargs, fare l'insert<br></div><div>abbastanza KISS, insomma<br></div><br>ok, show me the code!<br><br>        import openpyxl as pyx<br></div><div>        from .models import MyModel</div><div><br>        CN = XLSX_COLUMN_NAMES<br><br></div><div></div><div>        wb = pyx.load_workbook("sample.xlsx"))  <br>        ws = wb['DB']<br>        columns = {c.column: CN.get(c.value) for c in ws.rows[0]}        <br>                                                                                  <br>        MyModel.objects.all().delete()                                      <br>        for row in ws.rows[1:]:                                                   <br>            kwargs = {columns[c.column]: c.value for c in row}          <br>            kwargs.pop(None)                                                       <br>            MyModel(**kwargs).save()                                        <br><br><br></div><div>le istruzioni per il db sono per django, e per di più sono un po' niubbe (nel senso che si poteva fare qualcosa di più bulk)<br></div><div>ma non è la parte importante: non fanno altro che cancellare tutti i record e poi inserirli uno per uno<br><br></div><div>E' quel kwargs.pop(None) che non mi piace<br></div><div>Ci ho girato un po' intorno, ma non mi viene in mente come rimuoverlo a meno di introdurre degli "if" che mi piacciono ancora meno<br></div><div><br></div><div>voi che ne dite?<br></div><div>Marco<br><br></div><div>P.S. se non conoscete openpyxl vi dico che l'attributo "value" è il contenuto della cella, mentre l'attributo "column" è la sua coordinata x in notazione-excel, ossia "A", "B", etc.<br></div><div>Per esempio, la cella "D13" ha cell.column == "D"<br><br></div><div>P.P.S. boh, mi sa che vi ho dato un po' troppo contesto rispetto al problema vero e proprio.<br></div><div>Ma diciamo che è stata anche l'occasione per citare qualche tecnologia che mi ha fatto comodo: openpyxl e ... Django!<br></div></div></div>