Depois de ser exposto a várias camadas de abstração de banco de dados, estou começando a me perguntar qual é o sentido de toda biblioteca inventar seu próprio paradigma diferente para acessar dados. Escolher um novo DAL é como aprender um novo idioma novamente, quando geralmente tudo o que eu quero fazer é convencer a camada a gerar uma consulta SQL que eu já escrevi na minha cabeça.
E isso sem sequer tocar na legibilidade após o fato:
# 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')
O que há de errado com a sintaxe SQL padrão? Foi criado para uma finalidade específica e se encaixa perfeitamente nessa finalidade. Talvez seja só eu, mas entendo o trecho C muito mais facilmente do que os dois primeiros. As palavras-chave renomeadas e os truques de sintaxe são fofos, mas o IMO, quando se trata de detalhes, não facilita a recuperação de linhas para o codificador.
Isso provavelmente pareceu um longo discurso, mas não é uma questão real aqui. Como todo DAL parece inventar uma nova DSL para consultas, em vez de apenas analisar o SQL testado e comprovado, deve haver benefícios em usar sintaxe diferente ou deficiências na sintaxe padrão do SQL que não sei que existem. Alguém poderia apontar o que estou negligenciando aqui?