blob: cb2123a30d26cb018a06ddd8169c8859473a9217 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Google Cloud Sql Operators &mdash; Airflow Documentation</title>
<script type="text/javascript" src="../../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<script type="text/javascript" src="../../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
<link rel="next" title="Google Cloud Transfer Service Operators" href="transfer.html" />
<link rel="prev" title="Google Cloud Text to Speech Operators" href="speech.html" />
<script>
document.addEventListener('DOMContentLoaded', function() {
var el = document.getElementById('changelog');
if (el !== null ) {
// [AIRFLOW-...]
el.innerHTML = el.innerHTML.replace(
/\[(AIRFLOW-[\d]+)\]/g,
`<a href="https://issues.apache.org/jira/browse/$1">[$1]</a>`
);
// (#...)
el.innerHTML = el.innerHTML.replace(
/\(#([\d]+)\)/g,
`<a href="https://github.com/apache/airflow/pull/$1">(#$1)</a>`
);
};
})
</script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-140539454-1']);
_gaq.push(['_trackPageview']);
</script>
<style>
.example-header {
position: relative;
background: #9AAA7A;
padding: 8px 16px;
margin-bottom: 0;
}
.example-header--with-button {
padding-right: 166px;
}
.example-header:after{
content: '';
display: table;
clear: both;
}
.example-title {
display:block;
padding: 4px;
margin-right: 16px;
color: white;
overflow-x: auto;
}
.example-header-button {
top: 8px;
right: 16px;
position: absolute;
}
.example-header + .highlight-python {
margin-top: 0 !important;
}
.viewcode-button {
display: inline-block;
padding: 8px 16px;
border: 0;
margin: 0;
outline: 0;
border-radius: 2px;
-webkit-box-shadow: 0 3px 5px 0 rgba(0,0,0,.3);
box-shadow: 0 3px 6px 0 rgba(0,0,0,.3);
color: #404040;
background-color: #e7e7e7;
cursor: pointer;
font-size: 16px;
font-weight: 500;
line-height: 1;
text-decoration: none;
text-overflow: ellipsis;
overflow: hidden;
text-transform: uppercase;
-webkit-transition: background-color .2s;
transition: background-color .2s;
vertical-align: middle;
white-space: nowrap;
}
.viewcode-button:visited {
color: #404040;
}
.viewcode-button:hover, .viewcode-button:focus {
color: #404040;
background-color: #d6d6d6;
}
</style>
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home"> Airflow
</a>
<div class="version">
1.10.5
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../project.html">Project</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../start.html">Quick Start</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorial.html">Tutorial</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../index.html">How-to Guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../set-config.html">Setting Configuration Options</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../initialize-database.html">Initializing a Database Backend</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../index.html">Using Operators</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../bash.html">BashOperator</a></li>
<li class="toctree-l3"><a class="reference internal" href="../dingding.html">Dingding Operators</a></li>
<li class="toctree-l3 current"><a class="reference internal" href="index.html">Google Cloud Operators</a><ul class="current">
<li class="toctree-l4"><a class="reference internal" href="bigtable.html">Google Cloud Bigtable Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="cloud_build.html">Google Cloud Build Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="compute.html">Google Compute Engine Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="function.html">Google Cloud Functions Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="gcs.html">Google Cloud Storage Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="natural_language.html">Google Cloud Natural Language Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="spanner.html">Google Cloud Spanner Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="speech.html">Google Cloud Text to Speech Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="speech.html#google-cloud-speech-to-text-operators">Google Cloud Speech to Text Operators</a></li>
<li class="toctree-l4 current"><a class="current reference internal" href="#">Google Cloud Sql Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="transfer.html">Google Cloud Transfer Service Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="translate.html">Google Cloud Translate Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="translate-speech.html">Google Cloud Speech Translate Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="video.html">Google Cloud Video Intelligence Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="vision.html">Google Cloud Vision Operators</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../python.html">PythonOperator</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../connection/index.html">Managing Connections</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../secure-connections.html">Securing Connections</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../secure-connections.html#rotating-encryption-keys">Rotating encryption keys</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../write-logs.html">Writing Logs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../executor/use-celery.html">Celery Executor</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../executor/use-dask.html">Dask Executor</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../executor/use-mesos.html">Scaling Out with Mesos (community contributed)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../run-behind-proxy.html">Running Airflow behind a reverse proxy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../run-with-systemd.html">Running Airflow with systemd</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../run-with-upstart.html">Running Airflow with upstart</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../use-test-config.html">Using the Test Mode Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../check-health.html">Checking Airflow Health Status</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../define_extra_link.html">Define an operator extra link</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../tracking-user-activity.html">Tracking User Activity</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../ui.html">UI / Screenshots</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../concepts.html">Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../profiling.html">Data Profiling</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../cli.html">Command Line Interface Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../scheduler.html">Scheduling &amp; Triggers</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../plugins.html">Plugins</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../security.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../timezone.html">Time zones</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../api.html">REST API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../integration.html">Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../metrics.html">Metrics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../kubernetes.html">Kubernetes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../lineage.html">Lineage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../changelog.html">Changelog</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../faq.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../macros.html">Macros reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../_api/index.html">Python API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../privacy_notice.html">Privacy Notice</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">Airflow</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../index.html">How-to Guides</a> &raquo;</li>
<li><a href="../index.html">Using Operators</a> &raquo;</li>
<li><a href="index.html">Google Cloud Operators</a> &raquo;</li>
<li>Google Cloud Sql Operators</li>
<li class="wy-breadcrumbs-aside">
<a href="../../../_sources/howto/operator/gcp/sql.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<blockquote>
<div></div></blockquote>
<div class="section" id="google-cloud-sql-operators">
<h1>Google Cloud Sql Operators<a class="headerlink" href="#google-cloud-sql-operators" title="Permalink to this headline"></a></h1>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#cloudsqlinstancedatabasecreateoperator" id="id34">CloudSqlInstanceDatabaseCreateOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlinstancedatabasedeleteoperator" id="id35">CloudSqlInstanceDatabaseDeleteOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlinstancedatabasepatchoperator" id="id36">CloudSqlInstanceDatabasePatchOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlinstancedeleteoperator" id="id37">CloudSqlInstanceDeleteOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlinstanceexportoperator" id="id38">CloudSqlInstanceExportOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlinstanceimportoperator" id="id39">CloudSqlInstanceImportOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlinstancecreateoperator" id="id40">CloudSqlInstanceCreateOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlinstancepatchoperator" id="id41">CloudSqlInstancePatchOperator</a></p></li>
<li><p><a class="reference internal" href="#cloudsqlqueryoperator" id="id42">CloudSqlQueryOperator</a></p></li>
</ul>
</div>
<div class="section" id="cloudsqlinstancedatabasecreateoperator">
<span id="howto-operator-cloudsqlinstancedatabasecreateoperator"></span><h2><a class="toc-backref" href="#id34">CloudSqlInstanceDatabaseCreateOperator</a><a class="headerlink" href="#cloudsqlinstancedatabasecreateoperator" title="Permalink to this headline"></a></h2>
<p>Creates a new database inside a Cloud SQL instance.</p>
<p>For parameter definition, take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDatabaseCreateOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDatabaseCreateOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstanceDatabaseCreateOperator</span></code></a>.</p>
<div class="section" id="arguments">
<h3>Arguments<a class="headerlink" href="#arguments" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from environment variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="using-the-operator">
<h3>Using the operator<a class="headerlink" href="#using-the-operator" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_db_create_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDatabaseCreateOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">db_create_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_db_create_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_db_create_task2</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDatabaseCreateOperator</span><span class="p">(</span>
<span class="n">body</span><span class="o">=</span><span class="n">db_create_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_db_create_task2&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
<p>Example request body:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">db_create_body</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;instance&quot;</span><span class="p">:</span> <span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">DB_NAME</span><span class="p">,</span>
<span class="s2">&quot;project&quot;</span><span class="p">:</span> <span class="n">GCP_PROJECT_ID</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="templating">
<h3>Templating<a class="headerlink" href="#templating" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span> <span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="more-information">
<h3>More information<a class="headerlink" href="#more-information" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation for <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/databases/insert">to create a new database inside the instance</a>.</p>
</div>
</div>
<div class="section" id="cloudsqlinstancedatabasedeleteoperator">
<span id="howto-operator-cloudsqlinstancedatabasedeleteoperator"></span><h2><a class="toc-backref" href="#id35">CloudSqlInstanceDatabaseDeleteOperator</a><a class="headerlink" href="#cloudsqlinstancedatabasedeleteoperator" title="Permalink to this headline"></a></h2>
<p>Deletes a database from a Cloud SQL instance.</p>
<p>For parameter definition, take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDatabaseDeleteOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDatabaseDeleteOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstanceDatabaseDeleteOperator</span></code></a>.</p>
<div class="section" id="id1">
<h3>Arguments<a class="headerlink" href="#id1" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from environment variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id2">
<h3>Using the operator<a class="headerlink" href="#id2" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_db_delete_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDatabaseDeleteOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">database</span><span class="o">=</span><span class="n">DB_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_db_delete_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_db_delete_task2</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDatabaseDeleteOperator</span><span class="p">(</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">database</span><span class="o">=</span><span class="n">DB_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_db_delete_task2&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id3">
<h3>Templating<a class="headerlink" href="#id3" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;database&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span>
<span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="id4">
<h3>More information<a class="headerlink" href="#id4" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation to <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/databases/delete">delete a database</a>.</p>
</div>
</div>
<div class="section" id="cloudsqlinstancedatabasepatchoperator">
<span id="howto-operator-cloudsqlinstancedatabasepatchoperator"></span><h2><a class="toc-backref" href="#id36">CloudSqlInstanceDatabasePatchOperator</a><a class="headerlink" href="#cloudsqlinstancedatabasepatchoperator" title="Permalink to this headline"></a></h2>
<p>Updates a resource containing information about a database inside a Cloud SQL instance
using patch semantics.
See: <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/how-tos/performance#patch">https://cloud.google.com/sql/docs/mysql/admin-api/how-tos/performance#patch</a></p>
<p>For parameter definition, take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDatabasePatchOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDatabasePatchOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstanceDatabasePatchOperator</span></code></a>.</p>
<div class="section" id="id5">
<h3>Arguments<a class="headerlink" href="#id5" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from environment variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id6">
<h3>Using the operator<a class="headerlink" href="#id6" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_db_patch_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDatabasePatchOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">db_patch_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">database</span><span class="o">=</span><span class="n">DB_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_db_patch_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_db_patch_task2</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDatabasePatchOperator</span><span class="p">(</span>
<span class="n">body</span><span class="o">=</span><span class="n">db_patch_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">database</span><span class="o">=</span><span class="n">DB_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_db_patch_task2&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
<p>Example request body:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">db_patch_body</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;charset&quot;</span><span class="p">:</span> <span class="s2">&quot;utf16&quot;</span><span class="p">,</span>
<span class="s2">&quot;collation&quot;</span><span class="p">:</span> <span class="s2">&quot;utf16_general_ci&quot;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id7">
<h3>Templating<a class="headerlink" href="#id7" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;database&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span>
<span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="id8">
<h3>More information<a class="headerlink" href="#id8" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation to <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/databases/patch">update a database</a>.</p>
</div>
</div>
<div class="section" id="cloudsqlinstancedeleteoperator">
<span id="howto-operator-cloudsqlinstancedeleteoperator"></span><h2><a class="toc-backref" href="#id37">CloudSqlInstanceDeleteOperator</a><a class="headerlink" href="#cloudsqlinstancedeleteoperator" title="Permalink to this headline"></a></h2>
<p>Deletes a Cloud SQL instance in Google Cloud Platform.</p>
<p>It is also used for deleting read and failover replicas.</p>
<p>For parameter definition, take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDeleteOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceDeleteOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstanceDeleteOperator</span></code></a>.</p>
<div class="section" id="id9">
<h3>Arguments<a class="headerlink" href="#id9" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from OS environment variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id10">
<h3>Using the operator<a class="headerlink" href="#id10" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_instance_delete_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDeleteOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_instance_delete_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_instance_delete_task2</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDeleteOperator</span><span class="p">(</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME2</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_instance_delete_task2&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
<p>Note: If the instance has read or failover replicas you need to delete them before you delete the primary instance.
Replicas are deleted the same way as primary instances:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_instance_failover_replica_delete_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDeleteOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">FAILOVER_REPLICA_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_instance_failover_replica_delete_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_instance_read_replica_delete_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceDeleteOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">READ_REPLICA_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_instance_read_replica_delete_task&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id11">
<h3>Templating<a class="headerlink" href="#id11" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span> <span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="id12">
<h3>More information<a class="headerlink" href="#id12" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation to <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/delete">delete a SQL instance</a>.</p>
</div>
</div>
<div class="section" id="cloudsqlinstanceexportoperator">
<span id="howto-operator-cloudsqlinstanceexportoperator"></span><h2><a class="toc-backref" href="#id38">CloudSqlInstanceExportOperator</a><a class="headerlink" href="#cloudsqlinstanceexportoperator" title="Permalink to this headline"></a></h2>
<p>Exports data from a Cloud SQL instance to a Cloud Storage bucket as a SQL dump
or CSV file.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This operator is idempotent. If executed multiple times with the same
export file URI, the export file in GCS will simply be overridden.</p>
</div>
<p>For parameter definition take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceExportOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceExportOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstanceExportOperator</span></code></a>.</p>
<div class="section" id="id13">
<h3>Arguments<a class="headerlink" href="#id13" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from Airflow variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">EXPORT_URI</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_EXPORT_URI&#39;</span><span class="p">,</span> <span class="s1">&#39;gs://bucketName/fileName&#39;</span><span class="p">)</span>
<span class="n">IMPORT_URI</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_IMPORT_URI&#39;</span><span class="p">,</span> <span class="s1">&#39;gs://bucketName/fileName&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<p>Example body defining the export operation:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">export_body</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;exportContext&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;fileType&quot;</span><span class="p">:</span> <span class="s2">&quot;sql&quot;</span><span class="p">,</span>
<span class="s2">&quot;uri&quot;</span><span class="p">:</span> <span class="n">EXPORT_URI</span><span class="p">,</span>
<span class="s2">&quot;sqlExportOptions&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;schemaOnly&quot;</span><span class="p">:</span> <span class="bp">False</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id14">
<h3>Using the operator<a class="headerlink" href="#id14" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_export_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceExportOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">export_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_export_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_export_task2</span> <span class="o">=</span> <span class="n">CloudSqlInstanceExportOperator</span><span class="p">(</span>
<span class="n">body</span><span class="o">=</span><span class="n">export_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_export_task2&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id15">
<h3>Templating<a class="headerlink" href="#id15" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span> <span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="id16">
<h3>More information<a class="headerlink" href="#id16" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation to <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/export">export data</a>.</p>
</div>
<div class="section" id="troubleshooting">
<h3>Troubleshooting<a class="headerlink" href="#troubleshooting" title="Permalink to this headline"></a></h3>
<p>If you receive an “Unauthorized” error in GCP, make sure that the service account
of the Cloud SQL instance is authorized to write to the selected GCS bucket.</p>
<p>It is not the service account configured in Airflow that communicates with GCS,
but rather the service account of the particular Cloud SQL instance.</p>
<p>To grant the service account with the appropriate WRITE permissions for the GCS bucket
you can use the <a class="reference internal" href="../../../_api/airflow/contrib/operators/gcs_acl_operator/index.html#airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageBucketCreateAclEntryOperator" title="airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageBucketCreateAclEntryOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">GoogleCloudStorageBucketCreateAclEntryOperator</span></code></a>,
as shown in the example:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_gcp_add_bucket_permission_task</span> <span class="o">=</span> <span class="n">GoogleCloudStorageBucketCreateAclEntryOperator</span><span class="p">(</span>
<span class="n">entity</span><span class="o">=</span><span class="s2">&quot;user-{{ task_instance.xcom_pull(&quot;</span>
<span class="s2">&quot;&#39;sql_instance_create_task&#39;, key=&#39;service_account_email&#39;) &quot;</span>
<span class="s2">&quot;}}&quot;</span><span class="p">,</span>
<span class="n">role</span><span class="o">=</span><span class="s2">&quot;WRITER&quot;</span><span class="p">,</span>
<span class="n">bucket</span><span class="o">=</span><span class="n">export_url_split</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="c1"># netloc (bucket)</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_gcp_add_bucket_permission_task&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="cloudsqlinstanceimportoperator">
<span id="howto-operator-cloudsqlinstanceimportoperator"></span><h2><a class="toc-backref" href="#id39">CloudSqlInstanceImportOperator</a><a class="headerlink" href="#cloudsqlinstanceimportoperator" title="Permalink to this headline"></a></h2>
<p>Imports data into a Cloud SQL instance from a SQL dump or CSV file in Cloud Storage.</p>
<div class="section" id="csv-import">
<h3>CSV import:<a class="headerlink" href="#csv-import" title="Permalink to this headline"></a></h3>
<p>This operator is NOT idempotent for a CSV import. If the same file is imported
multiple times, the imported data will be duplicated in the database.
Moreover, if there are any unique constraints the duplicate import may result in an
error.</p>
</div>
<div class="section" id="sql-import">
<h3>SQL import:<a class="headerlink" href="#sql-import" title="Permalink to this headline"></a></h3>
<p>This operator is idempotent for a SQL import if it was also exported by Cloud SQL.
The exported SQL contains ‘DROP TABLE IF EXISTS’ statements for all tables
to be imported.</p>
<p>If the import file was generated in a different way, idempotence is not guaranteed.
It has to be ensured on the SQL file level.</p>
<p>For parameter definition take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceImportOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceImportOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstanceImportOperator</span></code></a>.</p>
</div>
<div class="section" id="id17">
<h3>Arguments<a class="headerlink" href="#id17" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from Airflow variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">EXPORT_URI</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_EXPORT_URI&#39;</span><span class="p">,</span> <span class="s1">&#39;gs://bucketName/fileName&#39;</span><span class="p">)</span>
<span class="n">IMPORT_URI</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_IMPORT_URI&#39;</span><span class="p">,</span> <span class="s1">&#39;gs://bucketName/fileName&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<p>Example body defining the import operation:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">import_body</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;importContext&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;fileType&quot;</span><span class="p">:</span> <span class="s2">&quot;sql&quot;</span><span class="p">,</span>
<span class="s2">&quot;uri&quot;</span><span class="p">:</span> <span class="n">IMPORT_URI</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id18">
<h3>Using the operator<a class="headerlink" href="#id18" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_import_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceImportOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">import_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME2</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_import_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_import_task2</span> <span class="o">=</span> <span class="n">CloudSqlInstanceImportOperator</span><span class="p">(</span>
<span class="n">body</span><span class="o">=</span><span class="n">import_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME2</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_import_task2&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id19">
<h3>Templating<a class="headerlink" href="#id19" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span> <span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="id20">
<h3>More information<a class="headerlink" href="#id20" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation to <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/import">import data</a>.</p>
</div>
<div class="section" id="id21">
<h3>Troubleshooting<a class="headerlink" href="#id21" title="Permalink to this headline"></a></h3>
<p>If you receive an “Unauthorized” error in GCP, make sure that the service account
of the Cloud SQL instance is authorized to read from the selected GCS object.</p>
<p>It is not the service account configured in Airflow that communicates with GCS,
but rather the service account of the particular Cloud SQL instance.</p>
<p>To grant the service account with the appropriate READ permissions for the GCS object
you can use the <a class="reference internal" href="../../../_api/airflow/contrib/operators/gcs_acl_operator/index.html#airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageObjectCreateAclEntryOperator" title="airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageObjectCreateAclEntryOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">GoogleCloudStorageObjectCreateAclEntryOperator</span></code></a>,
as shown in the example:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_gcp_add_object_permission_task</span> <span class="o">=</span> <span class="n">GoogleCloudStorageObjectCreateAclEntryOperator</span><span class="p">(</span>
<span class="n">entity</span><span class="o">=</span><span class="s2">&quot;user-{{ task_instance.xcom_pull(&quot;</span>
<span class="s2">&quot;&#39;sql_instance_create_task2&#39;, key=&#39;service_account_email&#39;)&quot;</span>
<span class="s2">&quot; }}&quot;</span><span class="p">,</span>
<span class="n">role</span><span class="o">=</span><span class="s2">&quot;READER&quot;</span><span class="p">,</span>
<span class="n">bucket</span><span class="o">=</span><span class="n">import_url_split</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="c1"># netloc (bucket)</span>
<span class="n">object_name</span><span class="o">=</span><span class="n">import_url_split</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">:],</span> <span class="c1"># path (strip first &#39;/&#39;)</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_gcp_add_object_permission_task&#39;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">prev_task</span> <span class="o">=</span> <span class="n">next_dep</span><span class="p">(</span><span class="n">sql_gcp_add_object_permission_task</span><span class="p">,</span> <span class="n">prev_task</span><span class="p">)</span>
<span class="c1"># For import to work we also need to add the Cloud SQL instance&#39;s Service Account</span>
<span class="c1"># write access to the whole bucket!.</span>
<span class="n">sql_gcp_add_bucket_permission_2_task</span> <span class="o">=</span> <span class="n">GoogleCloudStorageBucketCreateAclEntryOperator</span><span class="p">(</span>
<span class="n">entity</span><span class="o">=</span><span class="s2">&quot;user-{{ task_instance.xcom_pull(&quot;</span>
<span class="s2">&quot;&#39;sql_instance_create_task2&#39;, key=&#39;service_account_email&#39;) &quot;</span>
<span class="s2">&quot;}}&quot;</span><span class="p">,</span>
<span class="n">role</span><span class="o">=</span><span class="s2">&quot;WRITER&quot;</span><span class="p">,</span>
<span class="n">bucket</span><span class="o">=</span><span class="n">import_url_split</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="c1"># netloc</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_gcp_add_bucket_permission_2_task&#39;</span><span class="p">,</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="cloudsqlinstancecreateoperator">
<span id="howto-operator-cloudsqlinstancecreateoperator"></span><h2><a class="toc-backref" href="#id40">CloudSqlInstanceCreateOperator</a><a class="headerlink" href="#cloudsqlinstancecreateoperator" title="Permalink to this headline"></a></h2>
<p>Creates a new Cloud SQL instance in Google Cloud Platform.</p>
<p>It is also used for creating read replicas.</p>
<p>For parameter definition, take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceCreateOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstanceCreateOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstanceCreateOperator</span></code></a>.</p>
<p>If an instance with the same name exists, no action will be taken and the operator
will succeed.</p>
<div class="section" id="id22">
<h3>Arguments<a class="headerlink" href="#id22" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from OS environment variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<p>Some other arguments are created based on the arguments above:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">FAILOVER_REPLICA_NAME</span> <span class="o">=</span> <span class="n">INSTANCE_NAME</span> <span class="o">+</span> <span class="s2">&quot;-failover-replica&quot;</span>
<span class="n">READ_REPLICA_NAME</span> <span class="o">=</span> <span class="n">INSTANCE_NAME</span> <span class="o">+</span> <span class="s2">&quot;-read-replica&quot;</span>
</pre></div>
</div>
</div>
<p>Example body defining the instance with failover replica:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">body</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="s2">&quot;settings&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;tier&quot;</span><span class="p">:</span> <span class="s2">&quot;db-n1-standard-1&quot;</span><span class="p">,</span>
<span class="s2">&quot;backupConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;binaryLogEnabled&quot;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s2">&quot;enabled&quot;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s2">&quot;startTime&quot;</span><span class="p">:</span> <span class="s2">&quot;05:00&quot;</span>
<span class="p">},</span>
<span class="s2">&quot;activationPolicy&quot;</span><span class="p">:</span> <span class="s2">&quot;ALWAYS&quot;</span><span class="p">,</span>
<span class="s2">&quot;dataDiskSizeGb&quot;</span><span class="p">:</span> <span class="mi">30</span><span class="p">,</span>
<span class="s2">&quot;dataDiskType&quot;</span><span class="p">:</span> <span class="s2">&quot;PD_SSD&quot;</span><span class="p">,</span>
<span class="s2">&quot;databaseFlags&quot;</span><span class="p">:</span> <span class="p">[],</span>
<span class="s2">&quot;ipConfiguration&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;ipv4Enabled&quot;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s2">&quot;requireSsl&quot;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="p">},</span>
<span class="s2">&quot;locationPreference&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;zone&quot;</span><span class="p">:</span> <span class="s2">&quot;europe-west4-a&quot;</span>
<span class="p">},</span>
<span class="s2">&quot;maintenanceWindow&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;hour&quot;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="s2">&quot;day&quot;</span><span class="p">:</span> <span class="mi">7</span><span class="p">,</span>
<span class="s2">&quot;updateTrack&quot;</span><span class="p">:</span> <span class="s2">&quot;canary&quot;</span>
<span class="p">},</span>
<span class="s2">&quot;pricingPlan&quot;</span><span class="p">:</span> <span class="s2">&quot;PER_USE&quot;</span><span class="p">,</span>
<span class="s2">&quot;replicationType&quot;</span><span class="p">:</span> <span class="s2">&quot;ASYNCHRONOUS&quot;</span><span class="p">,</span>
<span class="s2">&quot;storageAutoResize&quot;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s2">&quot;storageAutoResizeLimit&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s2">&quot;userLabels&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;my-key&quot;</span><span class="p">:</span> <span class="s2">&quot;my-value&quot;</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="s2">&quot;failoverReplica&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">FAILOVER_REPLICA_NAME</span>
<span class="p">},</span>
<span class="s2">&quot;databaseVersion&quot;</span><span class="p">:</span> <span class="s2">&quot;MYSQL_5_7&quot;</span><span class="p">,</span>
<span class="s2">&quot;region&quot;</span><span class="p">:</span> <span class="s2">&quot;europe-west4&quot;</span><span class="p">,</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<p>Example body defining read replica for the instance above:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">read_replica_body</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">READ_REPLICA_NAME</span><span class="p">,</span>
<span class="s2">&quot;settings&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;tier&quot;</span><span class="p">:</span> <span class="s2">&quot;db-n1-standard-1&quot;</span><span class="p">,</span>
<span class="p">},</span>
<span class="s2">&quot;databaseVersion&quot;</span><span class="p">:</span> <span class="s2">&quot;MYSQL_5_7&quot;</span><span class="p">,</span>
<span class="s2">&quot;region&quot;</span><span class="p">:</span> <span class="s2">&quot;europe-west4&quot;</span><span class="p">,</span>
<span class="s2">&quot;masterInstanceName&quot;</span><span class="p">:</span> <span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<p>Note: Failover replicas are created together with the instance in a single task.
Read replicas need to be created in separate tasks.</p>
</div>
<div class="section" id="id23">
<h3>Using the operator<a class="headerlink" href="#id23" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_instance_create_task</span> <span class="o">=</span> <span class="n">CloudSqlInstanceCreateOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_instance_create_task&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id24">
<h3>Templating<a class="headerlink" href="#id24" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span> <span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="id25">
<h3>More information<a class="headerlink" href="#id25" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation to <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/insert">create an instance</a>.</p>
</div>
</div>
<div class="section" id="cloudsqlinstancepatchoperator">
<span id="howto-operator-cloudsqlinstancepatchoperator"></span><h2><a class="toc-backref" href="#id41">CloudSqlInstancePatchOperator</a><a class="headerlink" href="#cloudsqlinstancepatchoperator" title="Permalink to this headline"></a></h2>
<p>Updates settings of a Cloud SQL instance in Google Cloud Platform (partial update).</p>
<p>For parameter definition, take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlInstancePatchOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlInstancePatchOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlInstancePatchOperator</span></code></a>.</p>
<p>This is a partial update, so only values for the settings specified in the body
will be set / updated. The rest of the existing instance’s configuration will remain
unchanged.</p>
<div class="section" id="id26">
<h3>Arguments<a class="headerlink" href="#id26" title="Permalink to this headline"></a></h3>
<p>Some arguments in the example DAG are taken from OS environment variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql&#39;</span><span class="p">)</span>
<span class="n">INSTANCE_NAME2</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME2&#39;</span><span class="p">,</span> <span class="s1">&#39;test-mysql2&#39;</span><span class="p">)</span>
<span class="n">DB_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;testdb&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<p>Example body defining the instance:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">patch_body</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="s2">&quot;settings&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;dataDiskSizeGb&quot;</span><span class="p">:</span> <span class="mi">35</span><span class="p">,</span>
<span class="s2">&quot;maintenanceWindow&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;hour&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
<span class="s2">&quot;day&quot;</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
<span class="s2">&quot;updateTrack&quot;</span><span class="p">:</span> <span class="s2">&quot;canary&quot;</span>
<span class="p">},</span>
<span class="s2">&quot;userLabels&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="s2">&quot;my-key-patch&quot;</span><span class="p">:</span> <span class="s2">&quot;my-value-patch&quot;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id27">
<h3>Using the operator<a class="headerlink" href="#id27" title="Permalink to this headline"></a></h3>
<p>You can create the operator with or without project id. If project id is missing
it will be retrieved from the GCP connection used. Both variants are shown:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sql_instance_patch_task</span> <span class="o">=</span> <span class="n">CloudSqlInstancePatchOperator</span><span class="p">(</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">GCP_PROJECT_ID</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">patch_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_instance_patch_task&#39;</span>
<span class="p">)</span>
<span class="n">sql_instance_patch_task2</span> <span class="o">=</span> <span class="n">CloudSqlInstancePatchOperator</span><span class="p">(</span>
<span class="n">body</span><span class="o">=</span><span class="n">patch_body</span><span class="p">,</span>
<span class="n">instance</span><span class="o">=</span><span class="n">INSTANCE_NAME</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;sql_instance_patch_task2&#39;</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id28">
<h3>Templating<a class="headerlink" href="#id28" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;project_id&#39;</span><span class="p">,</span> <span class="s1">&#39;instance&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">,</span> <span class="s1">&#39;api_version&#39;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="id29">
<h3>More information<a class="headerlink" href="#id29" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL API documentation to <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/admin-api/v1beta4/instances/patch">patch an instance</a>.</p>
</div>
</div>
<div class="section" id="cloudsqlqueryoperator">
<span id="howto-operator-cloudsqlqueryoperator"></span><h2><a class="toc-backref" href="#id42">CloudSqlQueryOperator</a><a class="headerlink" href="#cloudsqlqueryoperator" title="Permalink to this headline"></a></h2>
<p>Performs DDL or DML SQL queries in Google Cloud SQL instance. The DQL
(retrieving data from Google Cloud SQL) is not supported. You might run the SELECT
queries, but the results of those queries are discarded.</p>
<p>You can specify various connectivity methods to connect to running instance,
starting from public IP plain connection through public IP with SSL or both TCP and
socket connection via Cloud SQL Proxy. The proxy is downloaded and started/stopped
dynamically as needed by the operator.</p>
<p>There is a <em>gcpcloudsql://</em> connection type that you should use to define what
kind of connectivity you want the operator to use. The connection is a “meta”
type of connection. It is not used to make an actual connectivity on its own, but it
determines whether Cloud SQL Proxy should be started by <cite>CloudSqlDatabaseHook</cite>
and what kind of database connection (Postgres or MySQL) should be created
dynamically to connect to Cloud SQL via public IP address or via the proxy.
The ‘CloudSqlDatabaseHook` uses
<a class="reference internal" href="../../../_api/airflow/contrib/hooks/gcp_sql_hook/index.html#airflow.contrib.hooks.gcp_sql_hook.CloudSqlProxyRunner" title="airflow.contrib.hooks.gcp_sql_hook.CloudSqlProxyRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlProxyRunner</span></code></a> to manage Cloud SQL
Proxy lifecycle (each task has its own Cloud SQL Proxy)</p>
<p>When you build connection, you should use connection parameters as described in
<a class="reference internal" href="../../../_api/airflow/contrib/hooks/gcp_sql_hook/index.html#airflow.contrib.hooks.gcp_sql_hook.CloudSqlDatabaseHook" title="airflow.contrib.hooks.gcp_sql_hook.CloudSqlDatabaseHook"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlDatabaseHook</span></code></a>. You can see
examples of connections below for all the possible types of connectivity. Such connection
can be reused between different tasks (instances of <cite>CloudSqlQueryOperator</cite>). Each
task will get their own proxy started if needed with their own TCP or UNIX socket.</p>
<p>For parameter definition, take a look at
<a class="reference internal" href="../../../_api/airflow/contrib/operators/gcp_sql_operator/index.html#airflow.contrib.operators.gcp_sql_operator.CloudSqlQueryOperator" title="airflow.contrib.operators.gcp_sql_operator.CloudSqlQueryOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">CloudSqlQueryOperator</span></code></a>.</p>
<p>Since query operator can run arbitrary query, it cannot be guaranteed to be
idempotent. SQL query designer should design the queries to be idempotent. For example,
both Postgres and MySQL support CREATE TABLE IF NOT EXISTS statements that can be
used to create tables in an idempotent way.</p>
<div class="section" id="id30">
<h3>Arguments<a class="headerlink" href="#id30" title="Permalink to this headline"></a></h3>
<p>If you define connection via <cite>AIRFLOW_CONN_*</cite> URL defined in an environment
variable, make sure the URL components in the URL are URL-encoded.
See examples below for details.</p>
<p>Note that in case of SSL connections you need to have a mechanism to make the
certificate/key files available in predefined locations for all the workers on
which the operator can run. This can be provided for example by mounting
NFS-like volumes in the same path for all the workers.</p>
<p>Some arguments in the example DAG are taken from the OS environment variables:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql_query.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql_query.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span>
<span class="n">GCP_PROJECT_ID</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_PROJECT_ID&#39;</span><span class="p">,</span> <span class="s1">&#39;example-project&#39;</span><span class="p">)</span>
<span class="n">GCP_REGION</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCP_REGION&#39;</span><span class="p">,</span> <span class="s1">&#39;europe-west-1b&#39;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_INSTANCE_NAME_QUERY</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="s1">&#39;GCSQL_POSTGRES_INSTANCE_NAME_QUERY&#39;</span><span class="p">,</span>
<span class="s1">&#39;testpostgres&#39;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_DATABASE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_DATABASE_NAME&#39;</span><span class="p">,</span>
<span class="s1">&#39;postgresdb&#39;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_USER</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_USER&#39;</span><span class="p">,</span> <span class="s1">&#39;postgres_user&#39;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_PASSWORD</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_PASSWORD&#39;</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_PUBLIC_IP</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_PUBLIC_IP&#39;</span><span class="p">,</span> <span class="s1">&#39;0.0.0.0&#39;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_PUBLIC_PORT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_PUBLIC_PORT&#39;</span><span class="p">,</span> <span class="mi">5432</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_CLIENT_CERT_FILE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_CLIENT_CERT_FILE&#39;</span><span class="p">,</span>
<span class="s2">&quot;.key/postgres-client-cert.pem&quot;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_CLIENT_KEY_FILE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_CLIENT_KEY_FILE&#39;</span><span class="p">,</span>
<span class="s2">&quot;.key/postgres-client-key.pem&quot;</span><span class="p">)</span>
<span class="n">GCSQL_POSTGRES_SERVER_CA_FILE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_POSTGRES_SERVER_CA_FILE&#39;</span><span class="p">,</span>
<span class="s2">&quot;.key/postgres-server-ca.pem&quot;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_INSTANCE_NAME_QUERY</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_INSTANCE_NAME_QUERY&#39;</span><span class="p">,</span>
<span class="s1">&#39;testmysql&#39;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_DATABASE_NAME</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_DATABASE_NAME&#39;</span><span class="p">,</span> <span class="s1">&#39;mysqldb&#39;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_USER</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_USER&#39;</span><span class="p">,</span> <span class="s1">&#39;mysql_user&#39;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_PASSWORD</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_PASSWORD&#39;</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_PUBLIC_IP</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_PUBLIC_IP&#39;</span><span class="p">,</span> <span class="s1">&#39;0.0.0.0&#39;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_PUBLIC_PORT</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_PUBLIC_PORT&#39;</span><span class="p">,</span> <span class="mi">3306</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_CLIENT_CERT_FILE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_CLIENT_CERT_FILE&#39;</span><span class="p">,</span>
<span class="s2">&quot;.key/mysql-client-cert.pem&quot;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_CLIENT_KEY_FILE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_CLIENT_KEY_FILE&#39;</span><span class="p">,</span>
<span class="s2">&quot;.key/mysql-client-key.pem&quot;</span><span class="p">)</span>
<span class="n">GCSQL_MYSQL_SERVER_CA_FILE</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;GCSQL_MYSQL_SERVER_CA_FILE&#39;</span><span class="p">,</span>
<span class="s2">&quot;.key/mysql-server-ca.pem&quot;</span><span class="p">)</span>
<span class="n">SQL</span> <span class="o">=</span> <span class="p">[</span>
<span class="s1">&#39;CREATE TABLE IF NOT EXISTS TABLE_TEST (I INTEGER)&#39;</span><span class="p">,</span>
<span class="s1">&#39;CREATE TABLE IF NOT EXISTS TABLE_TEST (I INTEGER)&#39;</span><span class="p">,</span> <span class="c1"># shows warnings logged</span>
<span class="s1">&#39;INSERT INTO TABLE_TEST VALUES (0)&#39;</span><span class="p">,</span>
<span class="s1">&#39;CREATE TABLE IF NOT EXISTS TABLE_TEST2 (I INTEGER)&#39;</span><span class="p">,</span>
<span class="s1">&#39;DROP TABLE TABLE_TEST&#39;</span><span class="p">,</span>
<span class="s1">&#39;DROP TABLE TABLE_TEST2&#39;</span><span class="p">,</span>
<span class="p">]</span>
</pre></div>
</div>
</div>
<p>Example connection definitions for all connectivity cases. Note that all the components
of the connection URI should be URL-encoded:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql_query.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql_query.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span>
<span class="n">HOME_DIR</span> <span class="o">=</span> <span class="n">expanduser</span><span class="p">(</span><span class="s2">&quot;~&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_absolute_path</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
<span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="n">path</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">HOME_DIR</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
<span class="n">postgres_kwargs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="n">user</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_USER</span><span class="p">),</span>
<span class="n">password</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_PASSWORD</span><span class="p">),</span>
<span class="n">public_port</span><span class="o">=</span><span class="n">GCSQL_POSTGRES_PUBLIC_PORT</span><span class="p">,</span>
<span class="n">public_ip</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_PUBLIC_IP</span><span class="p">),</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCP_PROJECT_ID</span><span class="p">),</span>
<span class="n">location</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCP_REGION</span><span class="p">),</span>
<span class="n">instance</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_INSTANCE_NAME_QUERY</span><span class="p">),</span>
<span class="n">database</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_DATABASE_NAME</span><span class="p">),</span>
<span class="n">client_cert_file</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">get_absolute_path</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_CLIENT_CERT_FILE</span><span class="p">)),</span>
<span class="n">client_key_file</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">get_absolute_path</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_CLIENT_KEY_FILE</span><span class="p">)),</span>
<span class="n">server_ca_file</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">get_absolute_path</span><span class="p">(</span><span class="n">GCSQL_POSTGRES_SERVER_CA_FILE</span><span class="p">))</span>
<span class="p">)</span>
<span class="c1"># The connections below are created using one of the standard approaches - via environment</span>
<span class="c1"># variables named AIRFLOW_CONN_* . The connections can also be created in the database</span>
<span class="c1"># of AIRFLOW (using command line or UI).</span>
<span class="c1"># Postgres: connect via proxy over TCP</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PROXY_POSTGRES_TCP&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=postgres&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=True&amp;&quot;</span> \
<span class="s2">&quot;sql_proxy_use_tcp=True&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">postgres_kwargs</span><span class="p">)</span>
<span class="c1"># Postgres: connect via proxy over UNIX socket (specific proxy version)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PROXY_POSTGRES_SOCKET&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=postgres&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=True&amp;&quot;</span> \
<span class="s2">&quot;sql_proxy_version=v1.13&amp;&quot;</span> \
<span class="s2">&quot;sql_proxy_use_tcp=False&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">postgres_kwargs</span><span class="p">)</span>
<span class="c1"># Postgres: connect directly via TCP (non-SSL)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PUBLIC_POSTGRES_TCP&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=postgres&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=False&amp;&quot;</span> \
<span class="s2">&quot;use_ssl=False&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">postgres_kwargs</span><span class="p">)</span>
<span class="c1"># Postgres: connect directly via TCP (SSL)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PUBLIC_POSTGRES_TCP_SSL&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=postgres&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=False&amp;&quot;</span> \
<span class="s2">&quot;use_ssl=True&amp;&quot;</span> \
<span class="s2">&quot;sslcert={client_cert_file}&amp;&quot;</span> \
<span class="s2">&quot;sslkey={client_key_file}&amp;&quot;</span> \
<span class="s2">&quot;sslrootcert={server_ca_file}&quot;</span>\
<span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">postgres_kwargs</span><span class="p">)</span>
<span class="n">mysql_kwargs</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
<span class="n">user</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_MYSQL_USER</span><span class="p">),</span>
<span class="n">password</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_MYSQL_PASSWORD</span><span class="p">),</span>
<span class="n">public_port</span><span class="o">=</span><span class="n">GCSQL_MYSQL_PUBLIC_PORT</span><span class="p">,</span>
<span class="n">public_ip</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_MYSQL_PUBLIC_IP</span><span class="p">),</span>
<span class="n">project_id</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCP_PROJECT_ID</span><span class="p">),</span>
<span class="n">location</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCP_REGION</span><span class="p">),</span>
<span class="n">instance</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_MYSQL_INSTANCE_NAME_QUERY</span><span class="p">),</span>
<span class="n">database</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">GCSQL_MYSQL_DATABASE_NAME</span><span class="p">),</span>
<span class="n">client_cert_file</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">get_absolute_path</span><span class="p">(</span><span class="n">GCSQL_MYSQL_CLIENT_CERT_FILE</span><span class="p">)),</span>
<span class="n">client_key_file</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">get_absolute_path</span><span class="p">(</span><span class="n">GCSQL_MYSQL_CLIENT_KEY_FILE</span><span class="p">)),</span>
<span class="n">server_ca_file</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">get_absolute_path</span><span class="p">(</span><span class="n">GCSQL_MYSQL_SERVER_CA_FILE</span><span class="p">))</span>
<span class="p">)</span>
<span class="c1"># MySQL: connect via proxy over TCP (specific proxy version)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PROXY_MYSQL_TCP&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=mysql&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=True&amp;&quot;</span> \
<span class="s2">&quot;sql_proxy_version=v1.13&amp;&quot;</span> \
<span class="s2">&quot;sql_proxy_use_tcp=True&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">mysql_kwargs</span><span class="p">)</span>
<span class="c1"># MySQL: connect via proxy over UNIX socket using pre-downloaded Cloud Sql Proxy binary</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sql_proxy_binary_path</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">check_output</span><span class="p">(</span>
<span class="p">[</span><span class="s1">&#39;which&#39;</span><span class="p">,</span> <span class="s1">&#39;cloud_sql_proxy&#39;</span><span class="p">])</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span><span class="p">:</span>
<span class="n">sql_proxy_binary_path</span> <span class="o">=</span> <span class="s2">&quot;/tmp/anyhow_download_cloud_sql_proxy&quot;</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PROXY_MYSQL_SOCKET&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=mysql&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=True&amp;&quot;</span> \
<span class="s2">&quot;sql_proxy_binary_path={sql_proxy_binary_path}&amp;&quot;</span> \
<span class="s2">&quot;sql_proxy_use_tcp=False&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">sql_proxy_binary_path</span><span class="o">=</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">sql_proxy_binary_path</span><span class="p">),</span> <span class="o">**</span><span class="n">mysql_kwargs</span><span class="p">)</span>
<span class="c1"># MySQL: connect directly via TCP (non-SSL)</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PUBLIC_MYSQL_TCP&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=mysql&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=False&amp;&quot;</span> \
<span class="s2">&quot;use_ssl=False&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">mysql_kwargs</span><span class="p">)</span>
<span class="c1"># MySQL: connect directly via TCP (SSL) and with fixed Cloud Sql Proxy binary path</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PUBLIC_MYSQL_TCP_SSL&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=mysql&amp;&quot;</span> \
<span class="s2">&quot;project_id={project_id}&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=False&amp;&quot;</span> \
<span class="s2">&quot;use_ssl=True&amp;&quot;</span> \
<span class="s2">&quot;sslcert={client_cert_file}&amp;&quot;</span> \
<span class="s2">&quot;sslkey={client_key_file}&amp;&quot;</span> \
<span class="s2">&quot;sslrootcert={server_ca_file}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">mysql_kwargs</span><span class="p">)</span>
<span class="c1"># Special case: MySQL: connect directly via TCP (SSL) and with fixed Cloud Sql</span>
<span class="c1"># Proxy binary path AND with missing project_id</span>
<span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;AIRFLOW_CONN_PUBLIC_MYSQL_TCP_SSL_NO_PROJECT_ID&#39;</span><span class="p">]</span> <span class="o">=</span> \
<span class="s2">&quot;gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?&quot;</span> \
<span class="s2">&quot;database_type=mysql&amp;&quot;</span> \
<span class="s2">&quot;location={location}&amp;&quot;</span> \
<span class="s2">&quot;instance={instance}&amp;&quot;</span> \
<span class="s2">&quot;use_proxy=False&amp;&quot;</span> \
<span class="s2">&quot;use_ssl=True&amp;&quot;</span> \
<span class="s2">&quot;sslcert={client_cert_file}&amp;&quot;</span> \
<span class="s2">&quot;sslkey={client_key_file}&amp;&quot;</span> \
<span class="s2">&quot;sslrootcert={server_ca_file}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">mysql_kwargs</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id31">
<h3>Using the operator<a class="headerlink" href="#id31" title="Permalink to this headline"></a></h3>
<p>Example operators below are using all connectivity options. Note connection id
from the operator matches the <cite>AIRFLOW_CONN_*</cite> postfix uppercase. This is
standard AIRFLOW notation for defining connection via environment variables):</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/contrib/example_dags/example_gcp_sql_query.py</span><a class="example-header-button viewcode-button reference internal" href="../../../_modules/airflow/contrib/example_dags/example_gcp_sql_query.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span>
<span class="n">connection_names</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;proxy_postgres_tcp&quot;</span><span class="p">,</span>
<span class="s2">&quot;proxy_postgres_socket&quot;</span><span class="p">,</span>
<span class="s2">&quot;public_postgres_tcp&quot;</span><span class="p">,</span>
<span class="s2">&quot;public_postgres_tcp_ssl&quot;</span><span class="p">,</span>
<span class="s2">&quot;proxy_mysql_tcp&quot;</span><span class="p">,</span>
<span class="s2">&quot;proxy_mysql_socket&quot;</span><span class="p">,</span>
<span class="s2">&quot;public_mysql_tcp&quot;</span><span class="p">,</span>
<span class="s2">&quot;public_mysql_tcp_ssl&quot;</span><span class="p">,</span>
<span class="s2">&quot;public_mysql_tcp_ssl_no_project_id&quot;</span>
<span class="p">]</span>
<span class="n">tasks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">with</span> <span class="n">models</span><span class="o">.</span><span class="n">DAG</span><span class="p">(</span>
<span class="n">dag_id</span><span class="o">=</span><span class="s1">&#39;example_gcp_sql_query&#39;</span><span class="p">,</span>
<span class="n">default_args</span><span class="o">=</span><span class="n">default_args</span><span class="p">,</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="bp">None</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">prev_task</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">for</span> <span class="n">connection_name</span> <span class="ow">in</span> <span class="n">connection_names</span><span class="p">:</span>
<span class="n">task</span> <span class="o">=</span> <span class="n">CloudSqlQueryOperator</span><span class="p">(</span>
<span class="n">gcp_cloudsql_conn_id</span><span class="o">=</span><span class="n">connection_name</span><span class="p">,</span>
<span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;example_gcp_sql_task_&quot;</span> <span class="o">+</span> <span class="n">connection_name</span><span class="p">,</span>
<span class="n">sql</span><span class="o">=</span><span class="n">SQL</span>
<span class="p">)</span>
<span class="n">tasks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">task</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prev_task</span><span class="p">:</span>
<span class="n">prev_task</span> <span class="o">&gt;&gt;</span> <span class="n">task</span>
<span class="n">prev_task</span> <span class="o">=</span> <span class="n">task</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id32">
<h3>Templating<a class="headerlink" href="#id32" title="Permalink to this headline"></a></h3>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">template_fields</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;sql&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_cloudsql_conn_id&#39;</span><span class="p">,</span> <span class="s1">&#39;gcp_conn_id&#39;</span><span class="p">)</span>
<span class="n">template_ext</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;.sql&#39;</span><span class="p">,)</span>
</pre></div>
</div>
</div>
<div class="section" id="id33">
<h3>More information<a class="headerlink" href="#id33" title="Permalink to this headline"></a></h3>
<p>See Google Cloud SQL documentation for <a class="reference external" href="https://cloud.google.com/sql/docs/mysql/sql-proxy">MySQL</a> and
<a class="reference external" href="https://cloud.google.com/sql/docs/postgres/sql-proxy">PostgreSQL</a> related proxies.</p>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="transfer.html" class="btn btn-neutral float-right" title="Google Cloud Transfer Service Operators" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="speech.html" class="btn btn-neutral float-left" title="Google Cloud Text to Speech Operators" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
<div class="footer">This page uses <a href="https://analytics.google.com/">
Google Analytics</a> to collect statistics. You can disable it by blocking
the JavaScript coming from www.google-analytics.com. Check our
<a href="../../../privacy_notice.html">Privacy Policy</a>
for more details.
<script type="text/javascript">
(function() {
var ga = document.createElement('script');
ga.src = ('https:' == document.location.protocol ?
'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
ga.setAttribute('async', 'true');
var nodes = document.documentElement.childNodes;
var i = -1;
var node;
do {
i++;
node = nodes[i]
} while(node.nodeType !== Node.ELEMENT_NODE);
node.appendChild(ga);
})();
</script>
</div>
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>