Po zetknięciu się z licznymi warstwami abstrakcji bazy danych zaczynam się zastanawiać, o co chodzi w tym, że każda biblioteka wymyśla swój własny paradygmat dostępu do danych. Odbieranie nowego DAL przypomina uczenie się nowego języka od nowa, kiedy zwykle wszystko, co chcę zrobić, to po prostu przekonać warstwę do wygenerowania zapytania SQL, które już napisałem w mojej głowie.
I to nawet bez wpływu na czytelność po fakcie:
# Exhibit A: A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
.inner_join(db.ips_x_users.user_id == db.users.id)
.select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)
# Exhibit B: Another typical DAL
rows = db.ips_x_users
.join(db.users, on=db.ips_x_users.user_id == db.users.id)
.filter(db.ips_x_users.ip_addr == '127.0.0.1')
.select(sort=~db.ips_x_users, limit=10)
# Exhibit C: A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
INNER JOIN users ON
(ips_x_users.user_id = users.id)
WHERE ips_x_users.ip_addr = ip
ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')
Co jest złego w standardowej składni SQL? Został stworzony do określonego celu i doskonale pasuje do tego celu. Może to tylko ja, ale rozumiem fragment C znacznie łatwiej niż pierwsze dwa. Zmienione nazwy słów kluczowych i sztuczki składniowe są urocze, ale IMO, jeśli chodzi o to, nie ułatwiają koderowi pobierania wierszy.
To prawdopodobnie wydawało się długim rantem, ale tutaj jest prawdziwe pytanie. Ponieważ każdy DAL wydaje się wymyślać nową DSL dla zapytań, a nie tylko analizować wypróbowany i prawdziwy SQL, muszą istnieć korzyści z użycia innej składni lub braki w standardowej składni SQL, o których nie wiem, że istnieją. Czy ktoś mógłby wskazać, co tutaj przeoczam?