Arrow Flight SQL#

A wire protocol for data systems that uses Apache Arrow. See the specification.

client API#

The API that an application uses to interact with a database. May abstract over the underlying wire protocol and other details. For example, ADBC, JDBC, ODBC.


Loosely speaking, a library that implements a client API using a wire protocol. For example, the ADBC PostgreSQL driver exposes the ADBC client API and interacts with a PostgreSQL database via the PostgreSQL wire protocol. The JDBC PostgreSQL driver uses the same wire protocol, but exposes the JDBC client API instead.

driver manager#

A library that helps manage multiple drivers for a given client API. For example, the JDBC driver manager can find a appropriate driver implementation for a database URI.

The ADBC driver manager in each language is similar. In C/C++, it can dynamically load drivers so that applications do not have to directly link to them. (Since all drivers expose the same API, their symbols would collide otherwise.) In Python, it loads drivers and provides Python bindings on top.


Substrait describes itself as a “cross-language serialization for relational algebra”. It operates in a similar space as SQL, but is lower-level. You’re unlikely to write a Substrait query by hand, but may use tools that opt to generate Substrait instead of SQL for more predictable semantics.

wire protocol#

The actual way a database driver connects to a database, issues commands, gets results, and so forth. For example, Arrow Flight SQL, the PostgreSQL wire protocol, or Tabular Data Stream (Microsoft SQL Server). Generally, an application is not going to implement and use this directly, but instead use something higher-level, like an ADBC, JDBC, or ODBC driver.