Pracoval jsem docela dost na Zend_Db
knihovna, která obsahuje PHP třídu pro vytváření SQL dotazů
. Rozhodl jsem se, že se pokusím zvládnout každou představitelnou syntaxi SQL v WHERE
a HAVING
klauzule z několika důvodů:
-
PHP je skriptovací jazyk, který analyzuje a kompiluje kód na každý požadavek (pokud nepoužíváte mezipaměť bajtového kódu). Prostředí PHP je tedy citlivé na objemné knihovny kódů - více než Java nebo C# nebo Python nebo co máte. Je proto vysokou prioritou udržovat knihovny co nejštíhlejší.
Všechny z
Zend_Db
knihovna, na které jsem pracoval, měla asi 2000 řádků kódu PHP. Naproti tomu Java Hibernate má řádově 118 tisíc řádků kódu. Ale to není tak velký problém, protože knihovna Java je předkompilovaná a nemusí se načítat při každém požadavku. -
Výrazy SQL se řídí generativní gramatikou, která je kompaktnější a snáze se čte a udržuje, než jakákoli konstrukce založená na PHP, kterou jste ukázali. Naučit se gramatiku výrazů SQL je mnohem jednodušší než naučit se API, které ji dokáže simulovat. Nakonec podpoříte „zjednodušenou gramatiku“. Nebo začnete tímto způsobem a zjistíte, že jste svou uživatelskou komunitou donuceni k Feature Creep dokud nebude vaše API nepoužitelně složité.
-
K ladění aplikace, která používala takové API, byste nevyhnutelně potřebovali přístup ke konečnému SQL výrazu, takže jde o nejděravější abstrakce můžeš mít.
-
Jedinou výhodou použití rozhraní založeného na PHP pro výrazy SQL by bylo, že pomáhá při dokončování kódu v inteligentních editorech a IDE. Ale když tolik operátorů a operandů používá řetězcové konstanty jako
'>='
, zkazíte jakoukoli inteligenci při dokončování kódu.
aktualizace: Právě jsem četl dobrý článek na blogu "A Farewell to ORMs ." Autor, Aldo Cortesi, navrhuje používat jazyk SQL Expression Language v SQLAlchemy Pythonu. Syntaktický cukr a přetěžování operátorů, které je standardní v Pythonu (ale není podporováno v PHP), z toho činí velmi efektivní řešení pro generování dotazů.
Můžete se také podívat na Perlův DBIx::Class, ale nakonec je to docela ošklivé.