:py:mod:`airflow.hooks.base`
============================

.. py:module:: airflow.hooks.base

.. autoapi-nested-parse::

   Base class for all hooks



Module Contents
---------------

Classes
~~~~~~~

.. autoapisummary::

   airflow.hooks.base.BaseHook
   airflow.hooks.base.DiscoverableHook




Attributes
~~~~~~~~~~

.. autoapisummary::

   airflow.hooks.base.log


.. py:data:: log
   

   

.. py:class:: BaseHook(context=None)

   Bases: :py:obj:`airflow.utils.log.logging_mixin.LoggingMixin`

   Abstract base class for hooks, hooks are meant as an interface to
   interact with external systems. MySqlHook, HiveHook, PigHook return
   object that can handle the connection and interaction to specific
   instances of these systems, and expose consistent methods to interact
   with them.

   .. py:method:: get_connections(cls, conn_id)
      :classmethod:

      Get all connections as an iterable, given the connection id.

      :param conn_id: connection id
      :return: array of connections


   .. py:method:: get_connection(cls, conn_id)
      :classmethod:

      Get connection, given connection id.

      :param conn_id: connection id
      :return: connection


   .. py:method:: get_hook(cls, conn_id)
      :classmethod:

      Returns default hook for this connection id.

      :param conn_id: connection id
      :return: default hook for this connection


   .. py:method:: get_conn(self)
      :abstractmethod:

      Returns connection for the hook.


   .. py:method:: get_connection_form_widgets(cls)
      :classmethod:


   .. py:method:: get_ui_field_behaviour(cls)
      :classmethod:



.. py:class:: DiscoverableHook

   Bases: :py:obj:`airflow.typing_compat.Protocol`

   Interface that providers *can* implement to be discovered by ProvidersManager.

   It is not used by any of the Hooks, but simply methods and class fields described here are
   implemented by those Hooks. Each method is optional -- only implement the ones you need.

   The conn_name_attr, default_conn_name, conn_type should be implemented by those
   Hooks that want to be automatically mapped from the connection_type -> Hook when get_hook method
   is called with connection_type.

   Additionally hook_name should be set when you want the hook to have a custom name in the UI selection
   Name. If not specified, conn_name will be used.

   The "get_ui_field_behaviour" and "get_connection_form_widgets" are optional - override them if you want
   to customize the Connection Form screen. You can add extra widgets to parse your extra fields via the
   get_connection_form_widgets method as well as hide or relabel the fields or pre-fill
   them with placeholders via get_ui_field_behaviour method.

   Note that the "get_ui_field_behaviour" and "get_connection_form_widgets" need to be set by each class
   in the class hierarchy in order to apply widget customizations.

   For example, even if you want to use the fields from your parent class, you must explicitly
   have a method on *your* class:

   .. code-block:: python

       @classmethod
       def get_ui_field_behaviour(cls):
           return super().get_ui_field_behaviour()

   You also need to add the Hook class name to list 'hook_class_names' in provider.yaml in case you
   build an internal provider or to return it in dictionary returned by provider_info entrypoint in the
   package you prepare.

   You can see some examples in airflow/providers/jdbc/hooks/jdbc.py.


   .. py:attribute:: conn_name_attr
      :annotation: :str

      

   .. py:attribute:: default_conn_name
      :annotation: :str

      

   .. py:attribute:: conn_type
      :annotation: :str

      

   .. py:attribute:: hook_name
      :annotation: :str

      

   .. py:method:: get_connection_form_widgets()
      :staticmethod:

      Returns dictionary of widgets to be added for the hook to handle extra values.

      If you have class hierarchy, usually the widgets needed by your class are already
      added by the base class, so there is no need to implement this method. It might
      actually result in warning in the logs if you try to add widgets that have already
      been added by the base class.

      Note that values of Dict should be of wtforms.Field type. It's not added here
      for the efficiency of imports.



   .. py:method:: get_ui_field_behaviour()
      :staticmethod:

      Returns dictionary describing customizations to implement in javascript handling the
      connection form. Should be compliant with airflow/customized_form_field_behaviours.schema.json'


      If you change conn_type in a derived class, you should also
      implement this method and return field customizations appropriate to your Hook. This
      is because the child hook will have usually different conn_type and the customizations
      are per connection type.

      .. seealso::
          :class:`~airflow.providers.google.cloud.hooks.compute_ssh.ComputeSSH` as an example




