Module type
Class type

New features:

  • A matchable representation of common causes of errors on the database
    side is now available, with limitations. It focuses on conditions which
    seem most likely useful to handle. At the moment we lack extended error
    codes from SQLite3 needed to make the cause fully precise.

  • Expose the underlying error details from database client libraries.
    This is meant to be use as a last resort, and requires directly linking
    with the relevant drivers.

  • A second set of request construction operators ->., ->?, ->!, and
    ->* were introduced after experience with converting existing code.
    Given the parameter and result type they return a function which
    constructs a request directly from a query string. Avoiding the need to
    compose with @:- simplifies local opens and usage with List.map etc.

  • Environment variables are now expanded in the debug log when using the
    new request constructors introduced in 1.7.0.

  • A new ?tweaks_version connection parameter has been added to control
    when the client is ready to adapt to changes in database session
    parameters or other adjustments of the interaction with specific
    database systems.

  • Enable foreign key constraint checks for SQLite3 starting at tweaks
    version 1.7.


  • Fixed debug logging to pass the correct driver info to the query
    callback instead of a dummy driver info which would cause a failure if


  • The --> operator was renamed to -->!, with a deprecated alias, for
    consistency with the new ->! operator.

  • The old convenience interface for creating requests has been deprecated
    in favour of the new infix operators and the new query template parser.

  • Documented-only deprecations of Caqti_sql_io, Caqti_lwt_sql_io, and
    Caqti_async_sql_io have been annotated.

v1.7.0 - 2022-02-13

New features:

  • Added a new query-string parser based on Angstrom. Its main advantage
    is that it can be used stand-alone e.g. to load SQL schemas from files
    split into individual statements which can be sent to the database.

  • Support passing a query environment to the connect and pool construction
    functions. This avoids using globals to modify the environment and
    facilitates e.g. targeting different database schemas with different
    connetions or connection pools.

  • A new Caqti_query.E case was added to support the two above cases.
    This is a breaking change, but hopefully does not break existing code.
    The exception (not counting module type of) would be if the
    constructors are aliased along with an alias of the type. On the other
    hand, pattern matching should be compatible since the new constructor is
    only emitted by newly introduced functions.

  • Added a module Caqti_request.Infix providing a new high-level API for
    constructing requests. It uses two-stage combinators, first to apply
    type arguments then to apply the query string. Apart from allowing
    nicer looking code, this solves the problem of switching to a the query
    string parser while maintaining backwards compatibility.

  • Added set_statement_timeout to connection modules, used to set query
    timeout. It is only supported for PostgreSQL and MariaDB. (#74)

  • Added with_transaction function to connection modules. This is just
    fail-safed wrapper around start, commit, and rollback.


  • Fixed delayed recovery of connection pools after loosing connections to
    PostgreSQL. Due to a missing call to consume inputs, the pool validator
    did not discover that a connection was lost before it was attempted

  • Improved resilience against exceptions and monadic errors in callbacks
    and fixed in-use checking.

  • Changed Sqlite3 driver to use non-linear parameters and improve error
    reporting when the wrong number of arguments are received (#77 & GPR#79
    Reynir Björnsson).

Other changes:

  • The Caqti license now uses the LGPL-3.0 Linking Exception instead of a
    rephrasing of the OCaml LGPL Linking Exception which was written for

  • Improved documentation, pretty-printing, logging, and exception details.

  • The test suite has been switched to use Alcotest; not without some
    struggle due to the use of test harness and argument-dependent test
    suite, but the result seems like a clear improvement.

v1.6.0 - 2021-06-10

  • Set the time zone of PostgreSQL connections to UTC to mitigate an
    undesirable implicit conversion to the local time zone for timestamp.
    This issue was exposed by the specification of field types introduced in
    version 1.4.0. Earlier versions worked as expected, if only accidentally,
    since the time zone is ignored when a string is converted to a
    timestamp. While this change makes timestamp more usable again for
    storing UTC time stamps, I strongly recommend using timestamp with time zone since it's interpretation is unambiguous. The API reference is now
    updated with details about how the ptime OCaml type is mapped for
    different database systems.

  • Drop specification of OCaml string as SQL text for PostgreSQL. This is
    due to issues with implicit conversions and function overloading when the
    desired type on the SQL side is char, varchar, or jsonb.

  • Add Caqti_type.redact to protect sensitive information from being

  • Only log parameters if $CAQTI_DEBUG_PARAM is set to "true".

  • When logging requests, show underlying values for custom types.

  • Reject multi-row response in find_opt implementation for sqlite3.

  • Tolerate Lwt promise rejections in Pool.use.

v1.5.1 - 2021-04-18

  • Fix option recognition in PostgreSQL driver (GPR#67 mefyl).

  • Fix option recognition in MariaDB driver and add test (Petter A. Urkedal).

v1.5.0 - 2021-04-11

  • Request the full UTF-8 character for the MariaDB connection.

  • Support int16 and enum types for parameters and rows.

v1.4.0 - 2021-03-11

  • Fix infinite loop when deserializing an optional tuple (GPR#63 mefyl).

  • Add Caqti_connect_sig.S.with_connection (GPR#61 Anton Bachin).

  • Pass parameter types to PostgreSQL prepare and query functions. This
    avoids the need to CAST parameters on the SQL side in some cases.

  • Add ?post_connect callback to connect_pool.

  • Documentation fixes and improvements (Aaron L. Zeng, Anton Bachin, Petter
    A. Urkedal).

v1.3.0 - 2021-01-17

  • Implement affected_count for sqlite backend (GPR#46 jakob).

  • Add method exec_with_affected_count to Caqti_connection_sig.S (GPR#45

  • Add ?max_idle_size to pool creation functions.

  • Dropped dependency on ppx_deriving due to issue with static compilation
    (GPR#50 Ulrik Strid).

  • Pass through $<var>$ in query strings and deprecate $$.

  • Log statements to be executed at debug level.

  • Add COPYING.OCAML and fix license expression in opam files.

  • Misc improvements to tests and documentation (GPR#51 Philippe Wang, GPR#54
    Reynir Björnsson, etc.).

v1.2.4 - 2020-06-07

  • Switch to TEXT format for PostgreSQL populate implementation.

v1.2.3 - 2020-06-02

  • Silence PostgreSQL notifications which were printed to stderr. They can
    be re-enabled with a parameter on the connection URI (#33).

  • Improve details in exceptions in two places.

  • Fix info about connection caching for sqlite in README (#35, dgllghr).

v1.2.2 - 2019-12-19

  • Update for core v0.13 (GPR#31 Xavier Clerc).

v1.2.1 - 2019-12-08

  • Support TEXT literals in queries.

  • Fix decoding of binary results for PostgreSQL (thanks to James Owen).

  • Implement copy-mode for PostgreSQL (GPR#30 James Owen).

v1.2.0 - 2019-10-02

  • Add a signature for the populate function, and add basic implementations
    for all drivers (GPR#28).

  • Add stream for result extraction (GPR#22 Nathan Rebours).

  • Use the postgres driver when postgres is specified as the URL scheme
    (GPR#25 James Owen).

  • Documentation improvements (GPR#20 Nathan Rebours, etc.).

  • Reimplemented partly ineffective prepare-cache for PostgreSQL.

  • Backwards incompatible changes to the driver API.

  • Backwards incompatible changes to modules marked internal but exposed due
    to being split across packages.

  • Fix forward compatibility past OCaml 4.08 as announced by deprecations.

v1.1.0 - 2019-02-03

  • Add pretty printer for requests.

  • Add variance to 'a future declarations.

  • Add blocking instance of API.

  • Generalize $. to $<var>. in queries.

  • Infer the expansion of $(<var>.) from $(<var>) if not provided.

  • Fix connection recovery for PostgreSQL (issue #19, Dave Aitken).

  • Fix some unhandled exceptions for PostgreSQL.

  • Fix connection validation for MariaDB.

v1.0.0 - 2018-08-26

  • Added Caqti_type.Std : Caqti_type_sig.Std, containing type descriptors
    needed for building requests, for easy inclusion in custom modules.

  • Fix ptime to string conversion for PostgreSQL (monstasat).

  • Support microsecond precision for MariaDB.

  • Removed Caqti_type.Field.ex and renamed Caqti_type.ex to
    Caqti_type.any and related functions.

  • Removed other deprecated definitions.

  • Moved Caqti_system_sig into Caqti_driver and split up the signature to
    make room for future drivers on alternative platforms.

v0.11.0 - 2018-05-25

Added and improved:

  • Compliance with Lwt 4.0 contributed by Brendan Long.

  • Switched to the logs library for logging.

  • Strengthen detection of concurrent use of connection.

  • Support microsecond precision for timestamps for PostgreSQL and
    millisecond for Sqlite3.

  • Use float for time spans in Sqlite3.

  • Map the octets type to BLOBs for MariaDB and Sqlite3.

  • Log recoverable errors for MariaDB and Sqlite3.


  • The v1 API is now removed.


  • CI setup contributed by Brendan Long.

  • Various documentation updates.

v0.10.2 - 2018-04-05

  • Fix incompatibility with ppx_optcomp v0.11.0 by dropping it, since the
    conditionals where no longer needed.

  • Restore test during opam build.

  • The v1 API is now fully [@@@deprecated] and will be removed in the next
    major release.

v0.10.1 - 2018-02-27

  • Fix a pool size counting bug when resource allocation fails. This can
    cause deadlock due to pool exhaustion.

v0.10.0 - 2018-02-14

  • Added -linkall flags to driver libraries to fix direct linking (#9).

  • Added convenience functions collect_list and rev_collect_list (#8).

  • Renamed template to query and related function, leaving deprecated

  • Added ptime_span field type mapping to SQL intervals.

  • Be more permissive about types of data returned from MariaDB when
    expecting numerical results.

v0.9.0 - 2018-01-04

  • Move v1 into findlib sublibraries and announce deprecation.

  • Port remaining tests to v2 and fix issues in MariaDB and Sqlite3 drivers.

  • Don't include password component of URIs in error messages.

  • Rename io type constructor to future.

  • Fix pool size limit enforcement.

  • Drop error on disconnect.

  • Support substitutions in request convenience functions.

v0.8.1 - 2017-12-06

  • Fix start transaction for PostgreSQL v2.

  • Fix dependency on ptime in caqti.opam in distribution.

v0.8.0 - 2017-12-04

  • Remove most deprecations.

  • Add new v2 API.

  • Move away most of the v1 API, but keep deprecated aliases for the client

The main difference of the new API compared to the old is:

  • It uses typed parameters and rows with an extensible variant for field
    type and a custom definable compound type.

  • The connection has a call method which gives access to a result object
    before iterating over the returned rows.

  • Error handling is done with the result type, using a collection of error
    types formed as polymorphic variants of records.

Notice: This version is mostly backwards compatible. New code should use
v2, but v1 will be kept for now. To keep using the v1 in upcoming releases:

  • Fix the new deprecations from this release.

  • Link with caqti-dynload to keep using dynamic loading, or link with the
    needed caqti-driver-*.v1 driver libraries.

  • Link with caqti.v1 instead of caqti.

  • Link with caqti-lwt.v1 instead of caqti-lwt.

  • Link with caqti-async.v1 instead of caqti-async.

v0.7.0 - 2017-11-03

  • Remove WRAPPER and REPORT functionality.

  • Remove deprecated findlib aliases.

  • Renamed date and utc conversions to date_cl and utc_cl.

  • Deprecate Caqti_metadata in favour of the new Caqti_driver_info.

  • Move various signature to separate files, leaving deprecated aliases.

v0.6.1 - 2017-10-26

  • Fixed support for lwt >= 3, but keep supporting 2.7 as well for now.

  • Fixed preparation of query after reconnect to PostgreSQL.

  • Fixed support for ocaml 4.03.x.

  • Added Tuple.length.

  • Deprecated Param.sub_types.

  • Deprecated Param.other and Tuple.other.

v0.6.0 - 2017-06-05

  • Split into separate packages to avoid depopts and rename findlib names

  • Use findlib to load DB drivers, and use -linkall. This hopefully solves
    loading issues.

v0.5.3 - 2017-05-22

  • Fix handling of spaces in Sqlite3 URIs and allow setting mode.

  • Split Caqti (now deprecated) into Caqti_errors and Caqti_connect.

  • Update to async 0.9.0.

v0.5.2 - 2017-02-25

  • Fix plugin loader to handle modernised META.

v0.5.1 - 2017-02-25 retracted

  • Rename libraries to match META.

v0.5.0 - 2017-02-25 retracted

  • Added MariaDB backend.

  • Fixed VARCHAR for SQLite3 describe.