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_Dbbiblioteka 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.