Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Umgang mit komplexen WHERE-Klauseln mit einem PHP Query Builder

Ich habe ziemlich viel an der Zend_Db gearbeitet Bibliothek, die eine PHP Klasse zum Erstellen von SQL-Abfragen enthält . Ich entschied mich dafür, zu versuchen, jede erdenkliche SQL-Syntax in WHERE zu handhaben und HAVING Klauseln, aus mehreren Gründen:

  • PHP ist eine Skriptsprache, die Code bei jeder Anfrage analysiert und kompiliert (es sei denn, Sie verwenden einen Bytecode-Cache). Die PHP-Umgebung reagiert also empfindlich auf umfangreiche Code-Bibliotheken – mehr als Java oder C# oder Python oder was auch immer. Es ist daher eine hohe Priorität, Bibliotheken so schlank wie möglich zu halten.

    Die gesamte Zend_Db Bibliothek, an der ich gearbeitet habe, bestand aus ungefähr 2.000 Zeilen PHP-Code. Im Gegensatz dazu ist Java Hibernate in der Größenordnung von 118.000 Codezeilen. Aber das ist kein so großes Problem, da eine Java-Bibliothek vorkompiliert ist und nicht bei jeder Anfrage geladen werden muss.

  • SQL-Ausdrücke folgen einer generativen Grammatik, die kompakter und einfacher zu lesen und zu warten ist als alle PHP-basierten Konstruktionen, die Sie gezeigt haben. Das Erlernen der SQL-Ausdrucksgrammatik ist viel einfacher als das Erlernen einer API, die sie simulieren kann. Am Ende unterstützen Sie eine „vereinfachte Grammatik“. Oder Sie fangen so an und werden von Ihrer Benutzergemeinschaft zu Feature Creep gezwungen bis Ihre API unbrauchbar komplex ist.

  • Um eine Anwendung zu debuggen, die eine solche API verwendet, benötigen Sie zwangsläufig Zugriff auf den endgültigen SQL-Ausdruck, also geht es um den undichteste Abstraktion du kannst haben.

  • Der einzige Vorteil bei der Verwendung einer PHP-basierten Schnittstelle für SQL-Ausdrücke wäre, dass sie die Code-Vervollständigung in intelligenten Editoren und IDEs unterstützt. Aber wenn so viele der Operatoren und Operanden String-Konstanten wie '>=' verwenden , verderben Sie jede Codevervollständigungsintelligenz.

Aktualisierung: Ich habe gerade einen guten Blog-Artikel „A Farewell to ORMs gelesen ." Der Autor, Aldo Cortesi, schlägt vor, die SQL Expression Language zu verwenden in Pythons SQLAlchemy. Syntaktischer Zucker und das Überladen von Operatoren, das in Python Standard ist (aber in PHP nicht unterstützt wird), machen dies zu einer sehr effektiven Lösung zum Generieren von Abfragen.

Sie können sich auch Perls DBIx::Class ansehen, aber es endet ziemlich hässlich.