On 2013-11-19 17:58, Pietro Battiston wrote:
Il giorno mar, 19/11/2013 alle 17.55 +0100, Manlio Perillo ha scritto:
On 19/11/2013 17:30, Pietro Battiston wrote:
> [...]
>> oppure:
>> for row in r:
>>      print row['id'], row['rel']
>
>
> Sì, questo mi è chiaro, ma a me piace più un
>
>      print mio_ogg.id, mio_ogg.rel
>

La differenza tra

        print row['id'], row['rel']

è solo di "facciata", specialmente se tieni conto che, in realtà, quello
che tu hai scritto è equivalente, in Python, a:

        print mio_ogg.__dict__['id'], mio_ogg.__dict__['rel']


Sì, sì, certo! Ti sto solo dicendo quale facciata preferisco...

L'interfaccia di quello che ottieni in Python (row.id, row.rel) è indipendente dagli strati sottostanti (usare o meno un orm). Puoi avere un driver che fa una query e restituisce un oggetto con gli attributi (es. psycopg2 con i NamedTupleCursor lo fa). Scrivere un wrapper che converte tuple/dizionari in oggetti è banale, molto più di un ORM.


> ... a te no?! Perché se sto parlando di utenti e loro informazioni, di > città e loro posizioni, e più in generale di oggetti e loro proprietà,
> dovrei scrivere di righe e loro elementi?!
>

Perchè è quello che realmente sono, visto che sono memorizzati in un
database relazionale.

... ma mi piacciono le facciate! Ovviamente, non tanto da sacrificare
l'efficienza.

Usando una facciata senza sapere cosa c'è dietro il più delle volte la sacrifica, l'efficienza.



> [...]
> Appunto... e anche nei casi in cui (poniamo) non ho tabelle collegate,
> con l'ORM la classe me la definisco io,

Perchè, la tabella SQL no?


Beh, sì... ma se non sbaglio il python è un linguaggio ad oggetti, non a
tabelle :-)

Python non è integralista di alcun paradigma specifico. Ha anche funzioni che non sono metodi di oggetti: che fai, quelle non le usi perché è "a oggetti"?

Pensare che tutto sia un oggetto è una limitazione molto pesante nel contesto dei database. Tanto per buttarla lì: "quanti ordini ho evaso ieri?". "ci sono ordini inevasi più vecchi di una settimana"? Sono esempi di domande che non hanno bisogno di modellare l'ordine nella sua interezza. Usare un ORM per questo tipo di richieste produce query inefficienti.


> posso aggiungerle dei metodi che
> mi servono,

Puoi anche definire funzioni libere, che operano sulla tuple (perchè
tanto in Python i metodi sono funzioni libere, alla fine).

... ci deve essere davvero qualcosa di grosso che mi sfugge se, mentre cerco di organizzare il mio codice in ordinate classi, un veterano (del
Vietnam? ;-) ) mi dice che in Python posso "anche definire funzioni
libere"...

OOP non vuol dire automaticamente buon design, soprattutto quando il problema non è inerentemente ad oggetti. E ORM non vuol dire automaticamente buon design, se in ambienti diversi (il codice e la base dati) il dominio si modella bene in maniera diversa. Dire "uso le classi quindi sto facendo bene" è più "ad una persona col martello ogni problema sembra un chiodo".

(per completezza cito anche JWZ: "once those database worms eat into your brain, it's hard to ever get anything practical done again. To a database person, every nail looks like a thumb. Or something like that")


Quello che mi incuriosiva era solo lo step successivo, "evita ORM se
possibile"... e ora dovrei avere di che riflettere.

Prego, rifletti pure. Ma fallo a mente aperta: se parti dai paradigmi

1. tutto è un oggetto
2. nel db ci sono solo oggetti

ovviamente arriverai alla conclusione che gli ORM sono l'invenzione migliore dopo il pane affettato. Prova con:

1. far diventare tutto un oggetto non è sempre utile
2. il modello relazionale è un soprainsieme del modello degli oggetti

e vedi come va.


-- Daniele

_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a