 .. 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.

.. _howto/operator:JdbcOperator:

JdbcOperator
============

Java Database Connectivity (JDBC) is an application programming interface
(API) for the programming language Java, which defines how a client may
access a database.

Prerequisite Tasks
^^^^^^^^^^^^^^^^^^

To use this operator you need:

  * Install the python module jaydebeapi:
    .. code-block:: bash

        pip install apache-airflow[jdbc]

  * Install a `JVM <https://adoptopenjdk.net/installation.html>`_ and
    add a ``JAVA_HOME`` env variable.
  * Have the JDBC driver for your database installed.

Once these prerequisites are satisfied you should be able to run
this Python snippet (replacing the variables values with the ones
related to your driver).

Other error messages will inform you in case the ``jaydebeapi`` module
is missing or the driver is not available. A ``Connection Refused``
error means that the connection string is pointing to host where no
database is listening for new connections.

  .. code-block:: python

    driver_class = "com.exasol.jdbc.EXADriver"
    driver_path = "/opt/airflow/drivers/exasol/EXASolution_JDBC-7.0.2/exajdbc.jar"
    connection_url = "jdbc:exa:localhost"
    credentials = ["", ""]

    conn = jaydebeapi.connect(
        driver_class,
        connection_url,
        credentials,
        driver_path,
    )

Usage
^^^^^
Use the :class:`~airflow.providers.jdbc.operators.jdbc` to execute
commands against a database (or data storage) accessible via a JDBC driver.

The :doc:`JDBC Connection <connections/jdbc>` must be passed as
``jdbc_conn_id``.

.. exampleinclude:: /../../airflow/providers/jdbc/example_dags/example_jdbc_queries.py
    :language: python
    :start-after: [START howto_operator_jdbc]
    :end-before: [END howto_operator_jdbc]

The parameter ``sql`` can receive a string or a list of strings.
Each string can be an SQL statement or a reference to a template file.
Template reference are recognized by ending in '.sql'.

The parameter ``autocommit`` if set to ``True`` will execute a commit after
each command (default is ``False``)

Templating
----------

You can use :ref:`Jinja templates <concepts:jinja-templating>` to parameterize
``sql``.

.. exampleinclude:: /../../airflow/providers/jdbc/example_dags/example_jdbc_queries.py
    :language: python
    :start-after: [START howto_operator_jdbc_template]
    :end-before: [END howto_operator_jdbc_template]
