Home

Awesome

Clojars Project

specql

A library for simple PostgreSQL queries with namespaced keys.

specql introspects your database at compile time and generates clojure.spec definitions for the rows and all the columns. You can then query for rows by giving a table, the keys to return and a map of keys to match against.

intro talk

For a quick intro, see my talk about specql at ClojuTRE 2017 Scrap your query boilerplate with specql

usage

See the docs for more examples.

(def db (make-my-db))

;; Define tables as [table-name :namespaced/table-keyword]
;; specql automatically creates specs for the columns of the table (in the same namespace as the
;; table keyword). For example if :employee/employees is the table and it has "id" and "name"
;; columns, specql will generate :employee/id and :employee/name specs with predicates
;; determined by the column data type
(define-tables define-db
  ["address" :address/address]
  ["employee" :employee/employees]
  ["department" :department/departments])

;; Querying

(fetch db
       ;; The table to query from
       :employee/employees
       ;; the columns to return
       #{:employee/id :employee/name :employee/title :employee/address}
       ;; the where clause
       {:employee/id 1})
;; => ({:employee/id 1
;;      :employee/name "Wile E. Coyote"
;;      :employee/title "Super genius"
;;      :employee/address {:address/street "Desert avenue 1"
;;                         :address/postal-code "31173"
;;                         :address/country "US"}})

Changes

20240920

20230316

20230315

20190301

20181212

20181211

20180706

20180312

0.7.0-alpha18 (2018-03-03)

Birthday release! Specql is now 1 year old.

0.7.0-alpha17 (2018-02-22)

0.7.0-alpha16 (2018-02-05)

0.7.0-alpha14 (2018-01-23)

0.7.0-alpha13 (2018-01-22)

0.7.0-alpha12 (2018-01-03)

0.7.0-alpha11

0.7.0-alpha10

0.7.0-alpha9

0.7.0-alpha8

0.7.0-alpha7

0.7.0-alpha6

0.7.0-alpha5

0.7.0-alpha4

0.7.0-alpha2 and -alpha3

0.7.0-alpha1

0.6

work in progress

This is very much still work in progress.

Features I intend to implement:

non-issues

This library is NOT intended to replace having to write SQL. The more complex SQL (like reporting queries and complex joins) queries are better written as SQL. Use yesql/jeesql/hugsql or the like.

This library intends to provide the most common case of CRUD queries and defer to SQL on the more difficult ones.

Specql can use VIEWs in the database just like tables, so you can write your complex queries as views and use them via specql.