Eu gosto de SQL puro, mas nunca me identifiquei com o estilo de abstração da maioria dos ORMs, mesmo gostando muito do conceito.
Nessa brincadeira cheguei até a criar um ORM pra MySQL com Node.js e gosto bastante dele. A ideia é ser algo bem minimalista e que, principalmente, lembre a sintaxe original do SQL ao ler e escrever a abstração.
Por exemplo, inserindo duas tabelas:
await pool.insert({
table: 'test',
values: [
{
column1: 'foo',
column2: 1,
},
{
column1: 'bar',
column2: 2,
},
],
});
Que nada mais é que uma abstração para:
INSERT INTO `test` (`column1`, `column2`) VALUES (?, ?), (?, ?)
-- params: ['foo', 1, 'bar', 2]
A vantagem aqui é que fica muito mais fácil inserir múltiplas linhas dinamicamente com uma única query, independente do tamanho da lista dos valores, além de oferecer mais segurança por preparar os parâmetros automaticamente.
Já se fosse pra inserir um único valor, acabaria escrevendo mais com o ORM que com SQL puro. Com isso em mente, eu permito o uso do SQL puro para aproveitar a conexão do ORM sem a obrigação de fazer abstrações pra tudo (essa mesma ideia vale para queries extremamente complexas).
Geralmente a gente precisa apenas de: INSERT UPDATE DELETE SELECT SELECT (com 1 innerJOIN às vezes)