Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Manipulando cláusulas WHERE complexas com um construtor de consultas PHP


Trabalhei bastante no Zend_Db biblioteca, que inclui uma classe PHP para construir consultas SQL . Decidi tentar lidar com todas as sintaxes SQL imagináveis ​​em WHERE e HAVING cláusulas, por vários motivos:

  • PHP é uma linguagem de script que analisa e compila código em cada solicitação (a menos que você use um cache de bytecode). Portanto, o ambiente PHP é sensível a bibliotecas de código volumosas - mais do que Java ou C# ou Python ou o que você tem. Portanto, é uma alta prioridade manter as bibliotecas tão enxutas quanto possível.

    Todos os Zend_Db biblioteca em que trabalhei tinha cerca de 2.000 linhas de código PHP. Por outro lado, o Java Hibernate está na ordem de 118K linhas de código. Mas isso não é um problema, pois uma biblioteca Java é pré-compilada e não precisa ser carregada em todas as solicitações.

  • As expressões SQL seguem uma gramática generativa que é mais compacta e mais fácil de ler e manter do que qualquer construção baseada em PHP que você mostrou. Aprender a gramática da expressão SQL é muito mais fácil do que aprender uma API que pode simulá-la. Você acaba apoiando uma "gramática simplificada". Ou então você começa assim e se vê coagido por sua comunidade de usuários em Feature Creep até que sua API seja inutilmente complexa.

  • Para depurar um aplicativo que usa essa API, você inevitavelmente precisa ter acesso à expressão SQL final, portanto, trata-se do a abstração mais vazada você pode ter.

  • A única vantagem de usar uma interface baseada em PHP para expressões SQL seria que ela auxilia a conclusão de código em editores inteligentes e IDEs. Mas quando tantos operadores e operandos usam constantes de string como '>=' , você estraga qualquer inteligência de conclusão de código.

atualizar: Acabei de ler um bom artigo de blog "A Farewell to ORMs ." O escritor, Aldo Cortesi, sugere usar a SQL Expression Language no SQLAlchemy do Python. Açúcar sintático e sobrecarga de operadores que é padrão em Python (mas não suportado em PHP) tornam esta uma solução de geração de consulta muito eficaz.

Você também pode olhar para o DBIx::Class do Perl, mas ele acaba sendo bem feio.