Trochę pracowałem nad Zend_Db
biblioteka, która zawiera klasę PHP do konstruowania zapytań SQL
. Postanowiłem spróbować obsłużyć każdą możliwą do wyobrażenia składnię SQL w WHERE
i HAVING
klauzul, z kilku powodów:
-
PHP to język skryptowy, który analizuje i kompiluje kod na każde żądanie (chyba że używasz pamięci podręcznej kodu bajtowego). Tak więc środowisko PHP jest wrażliwe na obszerne biblioteki kodu - bardziej niż Java, C#, Python czy cokolwiek innego. Dlatego priorytetem jest, aby biblioteki były jak najszczuplejsze.
Wszystkie
Zend_Db
biblioteka nad którą pracowałem to około 2000 linii kodu PHP. Natomiast Java Hibernate jest rzędu 118 tys. linijek kodu. Ale to nie jest duży problem, ponieważ biblioteka Java jest prekompilowana i nie musi być ładowana przy każdym żądaniu. -
Wyrażenia SQL stosują gramatykę generatywną, która jest bardziej zwarta i łatwiejsza do odczytania i utrzymania niż jakakolwiek pokazana konstrukcja oparta na PHP. Nauka gramatyki wyrażeń SQL jest znacznie prostsza niż nauka interfejsu API, który może ją symulować. W końcu popierasz „uproszczoną gramatykę”. Albo zaczynasz w ten sposób i zostajesz zmuszony przez społeczność użytkowników do pełzanie funkcji dopóki Twój interfejs API nie będzie bezużytecznie złożony.
-
Aby debugować aplikację korzystającą z takiego interfejsu API, nieuchronnie potrzebujesz dostępu do końcowego wyrażenia SQL, więc chodzi o najszczelna abstrakcja możesz mieć.
-
Jedyną zaletą korzystania z interfejsu opartego na PHP dla wyrażeń SQL jest to, że wspomaga on uzupełnianie kodu w inteligentnych edytorach i środowiskach IDE. Ale kiedy tak wiele operatorów i operandów używa stałych łańcuchowych, takich jak
'>='
, psujesz wszelką inteligencję dotyczącą uzupełniania kodu.
aktualizacja: Właśnie przeczytałem dobry artykuł na blogu „Pożegnanie z ORM-ami Pisarz, Aldo Cortesi, sugeruje używanie języka wyrażeń SQL w SQLAlchemy Pythona. Cukier składniowy i przeciążanie operatorów, które są standardem w Pythonie (ale nieobsługiwane w PHP) sprawiają, że jest to bardzo skuteczne rozwiązanie do generowania zapytań.
Możesz również spojrzeć na klasę DBIx::Class Perla, ale okazuje się, że jest dość brzydka.