Mysql
 sql >> Database >  >> RDS >> Mysql

Gestione di clausole WHERE complesse con un generatore di query PHP

Ho lavorato parecchio su Zend_Db libreria, che include una classe per la costruzione di query SQL . Ho deciso di provare a gestire ogni immaginabile sintassi SQL in WHERE e HAVING clausole, per diversi motivi:

  • PHP è un linguaggio di scripting che analizza e compila il codice su ogni richiesta (a meno che non utilizzi una cache di bytecode). Quindi l'ambiente PHP è sensibile alle ingombranti librerie di codice, più di Java o C# o Python o altro. È quindi una priorità assoluta mantenere le biblioteche il più snelle possibile.

    Tutto il Zend_Db la libreria su cui ho lavorato era di circa 2.000 righe di codice PHP. Al contrario, Java Hibernate è nell'ordine di 118.000 righe di codice. Ma non è un grosso problema poiché una libreria Java è precompilata e non deve essere caricata ad ogni richiesta.

  • Le espressioni SQL seguono una grammatica generativa più compatta e più facile da leggere e mantenere rispetto a qualsiasi costruzione basata su PHP che hai mostrato. L'apprendimento della grammatica dell'espressione SQL è molto più semplice dell'apprendimento di un'API in grado di simularla. Finisci per supportare una "grammatica semplificata". Oppure inizi in questo modo e ti ritrovi costretto dalla tua comunità di utenti a Feature Creep fino a quando la tua API non è inutilizzabile.

  • Per eseguire il debug di un'applicazione che utilizzava una tale API, avresti inevitabilmente bisogno dell'accesso all'espressione SQL finale, quindi si tratta di astrazione più fuorviante Puoi avere.

  • L'unico vantaggio dell'utilizzo di un'interfaccia basata su PHP per le espressioni SQL sarebbe che aiuta il completamento del codice negli editor intelligenti e negli IDE. Ma quando così tanti operatori e operandi usano costanti stringa come '>=' , rovini qualsiasi intelligenza di completamento del codice.

aggiornamento: Ho appena letto un buon articolo sul blog "Addio agli ORM ." L'autore, Aldo Cortesi, suggerisce di utilizzare il linguaggio di espressione SQL in SQLAlchemy di Python. Lo zucchero sintattico e il sovraccarico degli operatori standard in Python (ma non supportato in PHP) rendono questa soluzione molto efficace per la generazione di query.

Potresti anche guardare DBIx::Class di Perl, ma finisce per essere piuttosto brutto.