После ознакомления с многочисленными уровнями абстракции базы данных я начинаю задаваться вопросом, в чем смысл каждой библиотеки, изобретающей свою собственную парадигму для доступа к данным. Получение нового DAL похоже на изучение нового языка снова и снова, когда обычно все, что я хочу сделать, - это просто убедить слой вывести SQL-запрос, который я уже написал в своей голове.
И это даже не касаясь читабельности после факта:
# 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')
Что не так со стандартным синтаксисом SQL? Он был создан для определенной цели, и он прекрасно подходит для этой цели. Может быть, это только я, но я понимаю, что фрагмент кода С гораздо легче, чем первые два. Переименованные ключевые слова и синтаксические хитрости симпатичны, но IMO, когда дело доходит до него, они не облегчают извлечение строк для программиста.
Вероятно, это выглядело как длинная напыщенная речь, но здесь есть реальный вопрос. Поскольку каждый DAL, похоже, изобретает новый DSL для запросов, а не просто анализирует проверенный и проверенный SQL-код, должны быть либо преимущества использования другого синтаксиса, либо недостатки стандартного синтаксиса SQL, которые я не осознаю. Может ли кто-нибудь указать, что я здесь пропускаю?