[Python] python DB/TABLES ...

Daniele Varrazzo piro a develer.com
Sab 11 Maggio 2013 16:26:41 CEST


On 2013-05-11 14:38, Remo The Last wrote:
> rispondo a tutti:
> chiedo scusa se non sono stato chiaro nel mio primo post.
>
> Devo
>  iniziare a capire la creazione di DB in Python. Ne sono ignorante ma
> non sono un neofita della programmazione. E quello che mi serve è un
> buon inizio per imparare i DB relazionali in Python.

I db relazionali sono un mondo loro, e python è un mondo suo: non 
impari "i db in python". Fanno due cose diverse, per cui convivono bene. 
Se usi postgres (come detto da Manlio) hai il meglio che i db 
relazionali possano offrire oggi. Io mantengo psycopg, il driver 
python-postgres più usato, per cui se scegli questa strada penso tu sia 
in una botte di ferro, sia come solidità delle tecnologie scelte che 
come aiuto che puoi chiedere in giro (in lista ci sono altri utenti 
"pesanti" di postgres). Psycopg ha ottima documentazione per quanto 
riguarda l'integrazione python-postgres, postgres ha ottima 
documentazione di suo... ma sterminata.

Fidati di quello che ti hanno risposto gli altri: tabelle che "cambiano 
schema" a seconda dei dati contenuti sono solo il segnale di un problema 
non definito bene. Non dico che non sia consentito cambiare idea mentre 
si lavora, ma non è che i tuoi dati decideranno automaticamente lo 
schema: casomai te lo suggeriranno.


> Praticamente
>  devo creare una decina di tabelle con almeno una 30ina di campi
> all'interno di ogni tabella. Alcuni di questi campi sono uguali per
> tutte tabelle mentre altri campi saranno creati in funzione dei
> risultati delle elaborazioni. I contenuti dei campi creati saranno
> spesso tutti uguali, ma saranno identificati in maniera diversa per
> distinguere gli uni dagli altri. Dunque, nella la mia tabella dovrò
> creare in automatico dei campi per poter inserire (in funz. delle
> elaborazioni) dei dati che mi serviranno in seguito.

Un modo di risolvere il fatto di avere parte dei campi comuni si può 
fare con una tabella di base che contiene la parte comune, più una serie 
di tabelle in relazione 1-1 che contengono i campi estesi. Ma questo è 
un modo di memorizzare dati polimorfi (è simile a una classe python con 
delle sottoclassi che hanno attributi aggiuntivi) ma di cui conosci lo 
schema, non dove le tabelle vengono estese quando lo decidono i dati.

Se in partenza non conosci lo schema, in postgres hai almeno due modi 
di archiviare dati parzialmente strutturati, con la possibilità di 
strutturarli in seguito al sorgere delle necessità: il tipo hstore 
(http://www.postgresql.org/docs/9.2/static/hstore.html) è praticamente 
un dizionario str -> str e consente di fare alcune ricerche indicizzate 
(es. trovare i record che contengono la chiave 'x' oppure la chiave 'x' 
col valore 'y'). Un altro è usare JSON 
(http://www.postgresql.org/docs/9.2/static/datatype-json.html) e 
memorizzare dati completamente non strutturati, ma per indicizzare 
questi dati devi costruire degli indici ad hoc. psycopg offre 
conversioni hstore <-> dict (con dizionari che contengono solo chiavi 
str e valori str oppure None: 
http://initd.org/psycopg/docs/extras.html#hstore-data-type) e 
conversioni json <-> qualunque cosa supportata da funzioni load/dump: 
http://initd.org/psycopg/docs/extras.html#json-adaptation).


> E le tabelle
>  sono leggere; non saranno impegnative per la macchina.
>
> Insomma mi serve un buon inizio, facile, intuitivo e veloce
> nell'apprendimento.

Te l'hanno detto già in 40: evita le tabelle dinamiche e tutto sarà 
facile. Prova la strada di tabelle che vengano estese automaticamente 
e... saranno cazzi tuoi :)


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python