Ruby vs Clojure: obtenha uma lista de tabelas de banco de dados

Aqui está um pequeno exemplo de algum código no qual eu estava trabalhando. Na suíte de teste para um serviço da web Clojure , eu precisava de uma função rápida para consultar uma lista de todas as tabelas no banco de dados Postgres para que eu pudesse truncá-las como parte de um acessório. Aqui está o Clojure:

(ns example
(:require [korma.core :refer [exec-raw]]))

(def all-tables
(map #(:table_name %)
(exec-raw [(str "SELECT table_name "
"FROM information_schema.tables "
"WHERE table_schema='public' "
"AND table_type='BASE TABLE'")] :results)))

E para comparação, veja como isso pode parecer em Ruby:

require 'activerecord'

def all_tables
query
= <<-SQL
SELECT table_name

FROM information_schema
.tables
WHERE table_schema
='public' AND table_type='BASE TABLE'
SQL

results
= ActiveRecord::Base.connection.execute query
results
.map { |r| r[:table_name] }
end

Observe as semelhanças? O Ruby é lido de cima para baixo, mas o Clojure é lido de dentro para fora. O fluxo é essencialmente:

  1. Crie uma string de consulta sql
  2. Execute-o em um banco de dados
  3. Aplique esta função anônima a cada um dos resultados
  4. Devolver implicitamente a nova coleção

Mesmo lendo do início ao fim, acho que o código Clojure se explica muito bem. “Mapeie esta função sobre a coleção de coisas que esta consulta retorna”. É claro que Ruby vence em simplicidade, mas Clojure continua a me surpreender com o quão expressivo pode ser. Depois de se acostumar com todos esses parênteses. 🙂