 .. 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:: /../../tests/system/providers/jdbc/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:: /../../tests/system/providers/jdbc/example_jdbc_queries.py
    :language: python
    :start-after: [START howto_operator_jdbc_template]
    :end-before: [END howto_operator_jdbc_template]
