sql >> Database >  >> RDS >> Mysql

Omgaan met complexe WHERE-clausules met een PHP Query Builder

Ik heb behoorlijk wat gewerkt aan de Zend_Db bibliotheek, die een PHP klasse bevat voor het construeren van SQL-query's . Ik besloot om te proberen elke denkbare SQL-syntaxis in WHERE . te verwerken en HAVING clausules, om verschillende redenen:

  • PHP is een scripttaal die bij elk verzoek code parseert en compileert (tenzij u een bytecode-cache gebruikt). Dus de PHP-omgeving is gevoelig voor omvangrijke codebibliotheken - meer dan Java of C# of Python of wat dan ook. Het is daarom een ​​hoge prioriteit om bibliotheken zo slank mogelijk te houden.

    Alle Zend_Db bibliotheek waar ik aan werkte, bestond uit ongeveer 2.000 regels PHP-code. Java Hibernate daarentegen is in de orde van grootte van 118K regels code. Maar dat is niet zozeer een probleem, aangezien een Java-bibliotheek vooraf is gecompileerd en niet bij elk verzoek hoeft te worden geladen.

  • SQL-expressies volgen een generatieve grammatica die compacter en gemakkelijker te lezen en te onderhouden is dan de op PHP gebaseerde constructie die u liet zien. Het leren van de grammatica van SQL-expressies is veel gemakkelijker dan het leren van een API die het kan simuleren. Je ondersteunt uiteindelijk een 'vereenvoudigde grammatica'. Of je begint op die manier en merkt dat je door je gebruikersgemeenschap gedwongen wordt om Feature Creep totdat uw API onbruikbaar complex is.

  • Om fouten op te sporen in een toepassing die een dergelijke API gebruikt, hebt u onvermijdelijk toegang nodig tot de uiteindelijke SQL-expressie, dus het gaat om de leakiest abstraction je kan hebben.

  • Het enige voordeel van het gebruik van een op PHP gebaseerde interface voor SQL-expressies zou zijn dat het helpt bij het aanvullen van code in slimme editors en IDE's. Maar als zoveel van de operators en operanden stringconstanten gebruiken zoals '>=' , bederft u elke intelligentie die code heeft voltooid.

bijwerken: Ik las net een goed blogartikel "A Farewell to ORMs ." De schrijver, Aldo Cortesi, stelt voor om de SQL Expression Language te gebruiken. in Python's SQLAlchemy. Syntactische suiker en overbelasting van operators die standaard is in Python (maar niet wordt ondersteund in PHP) maken dit een zeer effectieve oplossing voor het genereren van query's.

Je zou ook naar Perl's DBIx::Class kunnen kijken, maar het wordt uiteindelijk behoorlijk lelijk.



  1. Hoe stel ik een standaardrij in voor een query die geen rijen retourneert?

  2. SQLite - Gegevens verwijderen

  3. Prisma relaties

  4. Verouderd:mysql_connect()