:py:mod:`airflow.operators.sql`
===============================

.. py:module:: airflow.operators.sql


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

Classes
~~~~~~~

.. autoapisummary::

   airflow.operators.sql.BaseSQLOperator
   airflow.operators.sql.SQLCheckOperator
   airflow.operators.sql.SQLValueCheckOperator
   airflow.operators.sql.SQLIntervalCheckOperator
   airflow.operators.sql.SQLThresholdCheckOperator
   airflow.operators.sql.BranchSQLOperator



Functions
~~~~~~~~~

.. autoapisummary::

   airflow.operators.sql.parse_boolean



.. py:function:: parse_boolean(val)

   Try to parse a string into boolean.

   Raises ValueError if the input is not a valid true- or false-like string value.


.. py:class:: BaseSQLOperator(*, conn_id = None, database = None, hook_params = None, **kwargs)

   Bases: :py:obj:`airflow.models.BaseOperator`

   This is a base class for generic SQL Operator to get a DB Hook

   The provided method is .get_db_hook(). The default behavior will try to
   retrieve the DB hook based on connection type.
   You can custom the behavior by overriding the .get_db_hook() method.

   .. py:method:: get_db_hook(self)

      Get the database hook for the connection.

      :return: the database hook object.
      :rtype: DbApiHook



.. py:class:: SQLCheckOperator(*, sql, conn_id = None, database = None, **kwargs)

   Bases: :py:obj:`BaseSQLOperator`

   Performs checks against a db. The ``SQLCheckOperator`` expects
   a sql query that will return a single row. Each value on that
   first row is evaluated using python ``bool`` casting. If any of the
   values return ``False`` the check is failed and errors out.

   Note that Python bool casting evals the following as ``False``:

   * ``False``
   * ``0``
   * Empty string (``""``)
   * Empty list (``[]``)
   * Empty dictionary or set (``{}``)

   Given a query like ``SELECT COUNT(*) FROM foo``, it will fail only if
   the count ``== 0``. You can craft much more complex query that could,
   for instance, check that the table has the same number of rows as
   the source table upstream, or that the count of today's partition is
   greater than yesterday's partition, or that a set of metrics are less
   than 3 standard deviation for the 7 day average.

   This operator can be used as a data quality check in your pipeline, and
   depending on where you put it in your DAG, you have the choice to
   stop the critical path, preventing from
   publishing dubious data, or on the side and receive email alerts
   without stopping the progress of the DAG.

   :param sql: the sql to be executed. (templated)
   :param conn_id: the connection ID used to connect to the database.
   :param database: name of database which overwrite the defined one in connection

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['sql']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = ['.hql', '.sql']

      

   .. py:attribute:: template_fields_renderers
      

      

   .. py:attribute:: ui_color
      :annotation: = #fff7e6

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: SQLValueCheckOperator(*, sql, pass_value, tolerance = None, conn_id = None, database = None, **kwargs)

   Bases: :py:obj:`BaseSQLOperator`

   Performs a simple value check using sql code.

   :param sql: the sql to be executed. (templated)
   :param conn_id: the connection ID used to connect to the database.
   :param database: name of database which overwrite the defined one in connection

   .. py:attribute:: __mapper_args__
      

      

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['sql', 'pass_value']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = ['.hql', '.sql']

      

   .. py:attribute:: template_fields_renderers
      

      

   .. py:attribute:: ui_color
      :annotation: = #fff7e6

      

   .. py:method:: execute(self, context=None)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: SQLIntervalCheckOperator(*, table, metrics_thresholds, date_filter_column = 'ds', days_back = -7, ratio_formula = 'max_over_min', ignore_zero = True, conn_id = None, database = None, **kwargs)

   Bases: :py:obj:`BaseSQLOperator`

   Checks that the values of metrics given as SQL expressions are within
   a certain tolerance of the ones from days_back before.

   :param table: the table name
   :param conn_id: the connection ID used to connect to the database.
   :param database: name of database which will overwrite the defined one in connection
   :param days_back: number of days between ds and the ds we want to check
       against. Defaults to 7 days
   :param date_filter_column: The column name for the dates to filter on. Defaults to 'ds'
   :param ratio_formula: which formula to use to compute the ratio between
       the two metrics. Assuming cur is the metric of today and ref is
       the metric to today - days_back.

       max_over_min: computes max(cur, ref) / min(cur, ref)
       relative_diff: computes abs(cur-ref) / ref

       Default: 'max_over_min'
   :param ignore_zero: whether we should ignore zero metrics
   :param metrics_thresholds: a dictionary of ratios indexed by metrics

   .. py:attribute:: __mapper_args__
      

      

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['sql1', 'sql2']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = ['.hql', '.sql']

      

   .. py:attribute:: template_fields_renderers
      

      

   .. py:attribute:: ui_color
      :annotation: = #fff7e6

      

   .. py:attribute:: ratio_formulas
      

      

   .. py:method:: execute(self, context=None)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



.. py:class:: SQLThresholdCheckOperator(*, sql, min_threshold, max_threshold, conn_id = None, database = None, **kwargs)

   Bases: :py:obj:`BaseSQLOperator`

   Performs a value check using sql code against a minimum threshold
   and a maximum threshold. Thresholds can be in the form of a numeric
   value OR a sql statement that results a numeric.

   :param sql: the sql to be executed. (templated)
   :param conn_id: the connection ID used to connect to the database.
   :param database: name of database which overwrite the defined one in connection
   :param min_threshold: numerical value or min threshold sql to be executed (templated)
   :param max_threshold: numerical value or max threshold sql to be executed (templated)

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['sql', 'min_threshold', 'max_threshold']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = ['.hql', '.sql']

      

   .. py:attribute:: template_fields_renderers
      

      

   .. py:method:: execute(self, context=None)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.


   .. py:method:: push(self, meta_data)

      Optional: Send data check info and metadata to an external database.
      Default functionality will log metadata.



.. py:class:: BranchSQLOperator(*, sql, follow_task_ids_if_true, follow_task_ids_if_false, conn_id = 'default_conn_id', database = None, parameters = None, **kwargs)

   Bases: :py:obj:`BaseSQLOperator`, :py:obj:`airflow.models.SkipMixin`

   Allows a DAG to "branch" or follow a specified path based on the results of a SQL query.

   :param sql: The SQL code to be executed, should return true or false (templated)
      Template reference are recognized by str ending in '.sql'.
      Expected SQL query to return Boolean (True/False), integer (0 = False, Otherwise = 1)
      or string (true/y/yes/1/on/false/n/no/0/off).
   :param follow_task_ids_if_true: task id or task ids to follow if query returns true
   :param follow_task_ids_if_false: task id or task ids to follow if query returns false
   :param conn_id: the connection ID used to connect to the database.
   :param database: name of database which overwrite the defined one in connection
   :param parameters: (optional) the parameters to render the SQL query with.

   .. py:attribute:: template_fields
      :annotation: :Sequence[str] = ['sql']

      

   .. py:attribute:: template_ext
      :annotation: :Sequence[str] = ['.sql']

      

   .. py:attribute:: template_fields_renderers
      

      

   .. py:attribute:: ui_color
      :annotation: = #a22034

      

   .. py:attribute:: ui_fgcolor
      :annotation: = #F7F7F7

      

   .. py:method:: execute(self, context)

      This is the main method to derive when creating an operator.
      Context is the same dictionary used as when rendering jinja templates.

      Refer to get_template_context for more context.



