H2 Relational Databaseλ︎
H2 is a database distributed as library, making it a ideal for a self-contained development environment for a Clojure application with a relational database. Data is persisted to mv.db
files as SQL queries are executed in Clojure.
H2 database main features include * Very fast, open source, JDBC API * Embedded and server modes; in-memory databases * Browser based Console application * Small footprint: around 2 MB jar file size
Whilst H2 could be used for very small production web applications, it is recommended only as a development time database.
Using h2 in the REPLλ︎
H2 works with next.jdbc
, the defacto relational database library for Clojure.
Including H2 in Clojure projectsλ︎
next.jdbc
is highly recommended library for SQL queries in Clojure
{% tabs deps="deps.edn projects", lein="Leiningen projects" %}
{% content "deps" %}
To use H2 database as only a development database, add an :extra-deps
entry to include the H2 library in a :dev
alias in the project deps.edn
file.
{:deps
{org.clojure/clojure {:mvn/version "1.10.1"}
org.seancorfield/next.jdbc {:mvn/version "1.1.569"}}}
{:aliases
{:dev
{:extra-deps {com.h2database/h2 {:mvn/version "1.4.200"}}}}}
Alternative, if using practicalli/clojure-deps-edn
configuration, use the :database-h2
alias when starting the REPL to include the H2 library on the class path.
{% content "lein" %}
Edit the project.clj
configuration file and add the H2 library to the :dev-dependencies section to run H2 as the development only database.
(defproject project-name "1.0-SNAPSHOT"
:description "Database application using next.jdbc with H2 as development database"
:url "http://practicalli.github.io/clojure/"
:dependencies [[org.clojure/clojure "1.10.1"]
[seancorfield/next.jdbc "1.1.582"]]
:dev-dependencies [[com.h2database/h2 "1.4.200"]])
{% endtabs %}
Auto-increment values in H2 databaseλ︎
The IDENTITY
type is used for automatically generating an incrementing 64-bit long integer in H2 database.
CREATE TABLE public.account (
id IDENTITY NOT NULL PRIMARY KEY ,
name VARCHAR NOT NULL,
number VARCHAR NOT NULL,
sortcode VARCHAR NOT NULL,
created TIMESTAMP WITH TIME ZONE NOT NULL);
No need to pass a value for our primary key column value as it is being automatically generated by H2.