PDA

View Full Version : [Generico/Python] ORM Vs. raw sql


GByTe87
12-02-2013, 16:10
Buondì,
lancio un quesito ad alto potenziale 'guerra di religione' :p

Sto sviluppando una piccola applicazione web in Python (basata su Flask, presumibilmente) che si interfaccia con un db, parliamo di una decina di tabelle su un dbms ancora da decidere (qua si usa Oracle per tutto, ma preferirei un dedicato mysql o postgresql), in select / insert / update.

Ora.. avrebbe senso usare un orm (nello specifico SQLAlchemy, con cui ho giochicchiato in passato ma solo a scopo 'didattico') o continuo a scrivere SQL a mano? :asd:
Fino ad ora ho smanacciato su applicazioni molto semplici, max 1-2 tabelle usando sql liscio, quindi non saprei dire quali sarebbero i pro e i contro.

Nel frattempo sto spilucchiando un po' su Internet e su una copia di Essential SQLAlchemy trovata in ufficio, giusto per farmi un idea. :D

Thx!

cdimauro
12-02-2013, 17:57
Nel corso degli anni ho sviluppato una mia sorta di ORM, che mi consente di fare tipo:
DB.Users[ID, Surname, Name, Status, UUID].Where[ID.In(MyFriends.keys())].OrderBy[ID].List())
per cui tendenzialmente preferisco evitare di scrivere query SQL, ma sfrutto Python come linguaggio per rappresentare all'incirca le stesse cose (per roba più complessa sono costretto a ricorrere alle query "raw", ma si tratta di casi rari, perché in genere sfruttando view e stored procedure me ne esco lo stesso usando il mio "ORM").

In realtà non è proprio un ORM, perché non consente di creare istanze di un'entità, modificarle, o cancellarle.

Si tratta di un wrapper di alto livello che consente di esprimere SELECT, INSERT (con += ), DELETE (con -= ovviamente) e UPDATE (con = ) senza passare da SQL né da un sistema complesso qual è un ORM.

Mi trovo benissimo così, perché utilizzo una sintassi a me cara (Python), e mi astraggo dal particolare engine SQL per quanto possibile. Ad esempio non specifico %s o ? per il binding dei parametri: fa tutto lui in maniera trasparente. Oppure per prendere le 30 righe dopo le prime 10, uso il classico slicing di Python: [10 : 40], che verrà tradotto in LIMIT per MySQL e RAWS per FireBird, ecc.

GByTe87
12-02-2013, 18:29
Ah figata. :D

Vabbè alla fine credo che usero SQLAlchemy. Tanto con cursor e fetchmany me la so già cavare, così imparo ad usare qualcosa di nuovo. :D

cdimauro
12-02-2013, 20:34
SQLAlchemy è un'istituzione nel mondo di Python, per cui male non fai di sicuro. :)