.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at
..
..   http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied.  See the License for the
.. specific language governing permissions and limitations
.. under the License.

.. py:currentmodule:: adbc_driver_manager

==============
Driver Manager
==============

The ``adbc_driver_manager`` package provides a :term:`driver manager` interface
for Python. The package provides two APIs:

1. Low-level bindings that are essentially the same as the :doc:`C API <../format/specification>`.
2. If PyArrow or Polars are installed, a DBAPI_ (PEP 249) compliant interface.

.. _DBAPI: https://peps.python.org/pep-0249/

Installation
============

.. code-block:: shell

   pip install adbc_driver_manager

Usage
=====

The driver manager is different from the individual, driver-specific packages
such as ``adbc_driver_postgresql``.

With the driver-specific packages, you connect to the target database with the
``connect`` method provided by the package you're using.  For example,
:func:`adbc_driver_postgresql.connect` or :func:`adbc_driver_sqlite.connect`.
The driver shared library is bundled with the respective package and loaded
invisibly for the user.

With the driver manager package, you use a single package and API regardless of
the database you're connecting to. However, the user must install the driver for
their database as a separate step. :term:`Driver manifests <driver manifest>`
are a first step in making this experience better for users but more work is
planned to make this as straightforward as using driver-specific packages.

Low-Level API
-------------

First, create an :py:class:`AdbcDatabase`, passing ``driver`` and (optionally)
``entrypoint``. Then, create an :py:class:`AdbcConnection`.

.. note:: See :doc:`../format/driver_manifests` for more information on what to pass as the ``driver`` argument and how the driver manager finds and loads drivers.

.. code-block:: python

   import adbc_driver_manager

   # Note: You must install the driver shared library (.so, .dylib, .dll)
   # separately
   with adbc_driver_manager.AdbcDatabase(driver="PATH/TO/libadbc_driver_sqlite.so") as db:
       with adbc_driver_manager.AdbcConnection(db) as conn:
           pass

Connecting to a second database could be done in the same session using the same
code just with a different ``driver`` argument.

DBAPI API
---------

Use the DBAPI_ API by calling the ``dbapi.connect`` method, passing ``driver``
and (optionally) ``entrypoint``. These arguments work the same as with the
low-level API.

.. code-block:: python

   from adbc_driver_manager import dbapi

   # Note: You must install the driver shared library (.so, .dylib, .dll)
   # separately
   with dbapi.connect(driver="PATH/TO/libadbc_driver_sqlite.so") as conn:
      pass


API Reference
=============

See the API reference: :doc:`./api/adbc_driver_manager`.
