«

Datomic Local API

Most usage of Datomic Local should be via portable Client API calls. Capabilities that are specific to Datomic Local are available through the datomic.local namespace:

All Datomic Local API calls take a single arg-map argument.

(import-cloud arg-map)
(divert-system arg-map)
(release-db arg-map)

divert-system

Diverts subsequent d/client calls for system to local storage. arg-map has the following keys:

Keys of the divert-system arg-map
Key Value Required
:system the system to divert yes
:storage-dir overrides :storage-dir in ~/.datomic/local.edn  

release-db

Closes the connection to a database and releases the memory used by it. Values of that database can no longer be used. arg-map has the following keys:

Keys of the release-db arg-map
Key Value Required
:system system name yes
:db-name database name yes
:storage-dir overrides :storage-dir in ~/.datomic/local.edn  

import-cloud

Import a Datomic Cloud database into a durable Datomic Local database. arg-map has the following keys:

Keys of the import-cloud arg-map
Key Value Required
:source arg map for (Cloud) d/client merged with arg map for d/connect yes
:dest arg map for (Datomic Local) d/client merged with arg map for d/connect yes
:filter filter spec limits datoms to import  

A filter spec has the following keys, all optional:

Keys of the import-cloud filter spec
Key Value
:before t - include only txes before t, exclusive
:since t - include only txes after t, inclusive
:include-attrs map of attr -> filter
:exclude-attrs vector of attrs to be excluded

:include-attrs keys are either fully-qualified attribute names or a namespaced keyword with * as a name (includes all attrs in namespace, e.g. :order/*).

:include-attrs filters are maps with optional :before and :since keys limiting the time range for attributes as per before/since above.

Schema attributes are always included. When a filter spec is present:

  • All other attributes must be included explicitly.
  • Excludes take precedence over includes.

You can re-import to get more recent data if you have not transacted locally. You cannot import to a database that currently has an open connection.

The following example imports a customer database, including

  • all schema
  • all history of customers (except their secrets!)
  • orders since May 2020
(dl/import-cloud
 {:source {:system "customers"
           :db-name "customers"
           :server-type :ion
           :region "us-east-1"
           :endpoint "https://ljfrt3pr18.execute-api.us-east-1.amazonaws.com"}
  :dest {:system "production-imports"
         :server-type :datomic-local
         :db-name "customers-and-recent-orders"}
  :filter {:include-attrs
           {:customer/* {}
            :order/* {:since #inst \"2020-05\"}}
           :exclude-attrs [:customer/secret]}})