Работих доста по Zend_Db
библиотека, която включва PHP клас за конструиране на SQL заявки
. Реших да се опитам да се справя с всеки възможен SQL синтаксис в WHERE
и HAVING
клаузи по няколко причини:
-
PHP е скриптов език, който анализира и компилира код при всяка заявка (освен ако не използвате кеш на байткод). Така че PHP средата е чувствителна към обемисти кодови библиотеки - повече от Java или C# или Python или каквото имате. Ето защо е висок приоритет да поддържаме библиотеките възможно най-леки.
Всички
Zend_Db
библиотеката, върху която работих, беше около 2000 реда PHP код. За разлика от тях, Java Hibernate е от порядъка на 118K реда код. Но това не е толкова голям проблем, тъй като библиотеката на Java е предварително компилирана и не е необходимо да се зарежда при всяка заявка. -
SQL изразите следват генеративна граматика, която е по-компактна и по-лесна за четене и поддържане от която и да е от PHP-базираната конструкция, която показахте. Изучаването на граматиката на SQL израза е много по-лесно от изучаването на API, който може да го симулира. В крайна сметка поддържате „опростена граматика“. В противен случай започвате по този начин и се оказвате принудени от вашата потребителска общност в Feature Creep докато вашият API не стане неизползваемо сложен.
-
За да отстраните грешки в приложение, което използва такъв API, неизбежно ще ви е необходим достъп до крайния SQL израз, така че става дума за най-пропусклива абстракция можете да имате.
-
Единственото предимство при използването на PHP-базиран интерфейс за SQL изрази би било, че подпомага завършването на кода в интелигентни редактори и IDE. Но когато толкова много от операторите и операндите използват низови константи като
'>='
, вие разваляте всякаква информация за попълване на код.
актуализация: Току-що прочетох една добра статия в блога „Сбогом на ORMs ." Писателят, Алдо Кортези, предлага да се използва SQL Expression Language в SQLAlchemy на Python. Синтактичната захар и претоварването на оператори, които са стандартни в Python (но не се поддържат в PHP), правят това много ефективно решение за генериране на заявки.
Може да погледнете и DBIx::Class на Perl, но в крайна сметка той е доста грозен.