Mysql
 sql >> Base de données >  >> RDS >> Mysql

Gestion des clauses WHERE complexes avec un générateur de requêtes PHP

J'ai pas mal travaillé sur la Zend_Db bibliothèque, qui inclut une classe PHP pour construire des requêtes SQL . J'ai décidé d'essayer de gérer toutes les syntaxes SQL imaginables dans WHERE et HAVING clauses, pour plusieurs raisons :

  • PHP est un langage de script qui analyse et compile le code à chaque requête (sauf si vous utilisez un cache de bytecode). Ainsi, l'environnement PHP est sensible aux bibliothèques de code volumineuses - plus que Java ou C # ou Python ou autre. C'est donc une grande priorité de garder les bibliothèques aussi légères que possible.

    Tous les Zend_Db bibliothèque sur laquelle j'ai travaillé était d'environ 2 000 lignes de code PHP. En revanche, Java Hibernate est de l'ordre de 118 000 lignes de code. Mais ce n'est pas vraiment un problème puisqu'une bibliothèque Java est précompilée et n'a pas besoin d'être chargée à chaque requête.

  • Les expressions SQL suivent une grammaire générative qui est plus compacte, et plus facile à lire et à maintenir que n'importe quelle construction basée sur PHP que vous avez montrée. Apprendre la grammaire des expressions SQL est beaucoup plus facile que d'apprendre une API capable de la simuler. Vous finissez par soutenir une "grammaire simplifiée". Ou bien vous commencez de cette façon et vous vous retrouvez contraint par votre communauté d'utilisateurs à Feature Creep jusqu'à ce que votre API soit inutilement complexe.

  • Pour déboguer une application utilisant une telle API, vous auriez inévitablement besoin d'accéder à l'expression SQL finale, il s'agit donc du l'abstraction la plus fuyante vous pouvez avoir.

  • Le seul avantage à utiliser une interface basée sur PHP pour les expressions SQL serait qu'elle assiste la complétion de code dans les éditeurs intelligents et les IDE. Mais quand tant d'opérateurs et d'opérandes utilisent des constantes de chaîne comme '>=' , vous gâchez toute intelligence de complétion de code.

mise à jour : Je viens de lire un bon article de blog "Adieu aux ORM ." L'auteur, Aldo Cortesi, suggère d'utiliser le SQL Expression Language dans SQLAlchemy de Python. Le sucre syntaxique et la surcharge d'opérateurs standard en Python (mais non pris en charge en PHP) en font une solution de génération de requêtes très efficace.

Vous pourriez aussi regarder DBIx::Class de Perl, mais cela finit par être assez moche.