Sostituisci il tuo tavolo (key, listdata)
con (key, index, listitem)
. La chiave univoca per la tabella diventa (key, index)
anziché solo key
e si desidera garantire come condizione di coerenza che l'insieme di indici nella tabella per ogni chiave specificata sia contiguo a partire da 0.
È possibile o meno non è nemmeno necessario distinguere tra una chiave la cui lista è vuota e una chiave che non esiste affatto. Un modo è quello di avere due tabelle (una delle liste e uno dei loro elementi), in modo che una lista vuota ma esistente sia naturalmente rappresentata come una riga nella tabella degli elenchi senza righe corrispondenti nella tabella degli elementi. Un altro modo è solo per fudge e dire che una riga con index=null
implica che l'elenco per quella chiave è vuoto.
Si noti che ciò è utile se (e probabilmente solo se) si desidera agire sugli elementi dell'elenco utilizzando SQL (ad esempio, scrivere una query per estrarre l'ultimo elemento di ogni elenco nella tabella). Se non hai bisogno di farlo, allora non è completamente irragionevole trattare i tuoi elenchi come dati opachi nel DB. Stai solo perdendo la capacità del DB di "comprenderlo".
La domanda rimanente è quindi il modo migliore per serializzare/deserializzare l'elenco. str/eval
fa il lavoro, ma è un po 'preoccupante. Potresti considerare json.dumps
/json.loads
, che per un elenco di numeri interi è lo stesso formato di stringa ma con più restrizioni di sicurezza nel parser. Oppure potresti usare una rappresentazione binaria più compatta se lo spazio è un problema.
fonte
2013-09-02 22:49:43
2 modi. 1. Normalizza le tabelle, è necessario impostare una nuova tabella per il valore di lista. quindi ottieni qualcosa come "TABLE list (id)" e "TABLE list_values (list_id, value)". 2. Puoi serializzare la lista. Ex. Json, XML e così via (non è una buona pratica in SQL). – user1759572
puoi memorizzare i tuoi elenchi come BLOB: http://stackoverflow.com/questions/537077/python-sqlite3-how-to-convert-a-list-to-a-blob-cell – alecxe