diff --git a/airflow/providers/sqlite/example_dags/__init__.py b/airflow/providers/sqlite/example_dags/__init__.py deleted file mode 100644 index 217e5db960782..0000000000000 --- a/airflow/providers/sqlite/example_dags/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. diff --git a/airflow/providers/sqlite/example_dags/example_sqlite.py b/airflow/providers/sqlite/example_dags/example_sqlite.py deleted file mode 100644 index b1755996e281c..0000000000000 --- a/airflow/providers/sqlite/example_dags/example_sqlite.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -""" -This is an example DAG for the use of the SqliteOperator. -In this example, we create two tasks that execute in sequence. -The first task calls an sql command, defined in the SQLite operator, -which when triggered, is performed on the connected sqlite database. -The second task is similar but instead calls the SQL command from an external file. -""" - -from datetime import datetime - -from airflow import DAG -from airflow.providers.sqlite.hooks.sqlite import SqliteHook -from airflow.providers.sqlite.operators.sqlite import SqliteOperator - -dag = DAG( - dag_id='example_sqlite', - schedule_interval='@daily', - start_date=datetime(2021, 1, 1), - tags=['example'], - catchup=False, -) - -# [START howto_operator_sqlite] - -# Example of creating a task that calls a common CREATE TABLE sql command. -create_table_sqlite_task = SqliteOperator( - task_id='create_table_sqlite', - sql=r""" - CREATE TABLE Customers ( - customer_id INT PRIMARY KEY, - first_name TEXT, - last_name TEXT - ); - """, - dag=dag, -) - -# [END howto_operator_sqlite] - - -@dag.task(task_id="insert_sqlite_task") -def insert_sqlite_hook(): - sqlite_hook = SqliteHook() - - rows = [('James', '11'), ('James', '22'), ('James', '33')] - target_fields = ['first_name', 'last_name'] - sqlite_hook.insert_rows(table='Customers', rows=rows, target_fields=target_fields) - - -@dag.task(task_id="replace_sqlite_task") -def replace_sqlite_hook(): - sqlite_hook = SqliteHook() - - rows = [('James', '11'), ('James', '22'), ('James', '33')] - target_fields = ['first_name', 'last_name'] - sqlite_hook.insert_rows(table='Customers', rows=rows, target_fields=target_fields, replace=True) - - -# [START howto_operator_sqlite_external_file] - -# Example of creating a task that calls an sql command from an external file. -external_create_table_sqlite_task = SqliteOperator( - task_id='create_table_sqlite_external_file', - sql='create_table.sql', -) - -# [END howto_operator_sqlite_external_file] - -create_table_sqlite_task >> external_create_table_sqlite_task >> insert_sqlite_hook() >> replace_sqlite_hook() diff --git a/docs/apache-airflow-providers-sqlite/index.rst b/docs/apache-airflow-providers-sqlite/index.rst index f7e8841dd1ec6..933dd52995a34 100644 --- a/docs/apache-airflow-providers-sqlite/index.rst +++ b/docs/apache-airflow-providers-sqlite/index.rst @@ -39,7 +39,7 @@ Content :maxdepth: 1 :caption: Resources - Example DAGs + Example DAGs .. toctree:: :maxdepth: 1 diff --git a/docs/apache-airflow-providers-sqlite/operators.rst b/docs/apache-airflow-providers-sqlite/operators.rst index 6cbe5f6d3062e..604a2062bc964 100644 --- a/docs/apache-airflow-providers-sqlite/operators.rst +++ b/docs/apache-airflow-providers-sqlite/operators.rst @@ -51,14 +51,14 @@ the connection metadata is structured as follows: An example usage of the SqliteOperator is as follows: -.. exampleinclude:: /../../airflow/providers/sqlite/example_dags/example_sqlite.py +.. exampleinclude:: /../../tests/system/providers/sqlite/example_sqlite.py :language: python :start-after: [START howto_operator_sqlite] :end-before: [END howto_operator_sqlite] Furthermore, you can use an external file to execute the SQL commands. Script folder must be at the same level as DAG.py file. -.. exampleinclude:: /../../airflow/providers/sqlite/example_dags/example_sqlite.py +.. exampleinclude:: /../../tests/system/providers/sqlite/example_sqlite.py :language: python :start-after: [START howto_operator_sqlite_external_file] :end-before: [END howto_operator_sqlite_external_file] diff --git a/airflow/providers/sqlite/example_dags/create_table.sql b/tests/system/providers/sqlite/create_table.sql similarity index 100% rename from airflow/providers/sqlite/example_dags/create_table.sql rename to tests/system/providers/sqlite/create_table.sql diff --git a/tests/system/providers/sqlite/example_sqlite.py b/tests/system/providers/sqlite/example_sqlite.py new file mode 100644 index 0000000000000..cf0c74c1936ab --- /dev/null +++ b/tests/system/providers/sqlite/example_sqlite.py @@ -0,0 +1,102 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +""" +This is an example DAG for the use of the SqliteOperator. +In this example, we create two tasks that execute in sequence. +The first task calls an sql command, defined in the SQLite operator, +which when triggered, is performed on the connected sqlite database. +The second task is similar but instead calls the SQL command from an external file. +""" + +import os +from datetime import datetime + +from airflow import DAG +from airflow.providers.sqlite.hooks.sqlite import SqliteHook +from airflow.providers.sqlite.operators.sqlite import SqliteOperator + +ENV_ID = os.environ.get("SYSTEM_TESTS_ENV_ID") +DAG_ID = "example_sqlite" + +with DAG( + dag_id=DAG_ID, + schedule_interval='@daily', + start_date=datetime(2021, 1, 1), + tags=['example'], + catchup=False, +) as dag: + + # [START howto_operator_sqlite] + + # Example of creating a task that calls a common CREATE TABLE sql command. + create_table_sqlite_task = SqliteOperator( + task_id='create_table_sqlite', + sql=r""" + CREATE TABLE Customers ( + customer_id INT PRIMARY KEY, + first_name TEXT, + last_name TEXT + ); + """, + ) + + # [END howto_operator_sqlite] + + @dag.task(task_id="insert_sqlite_task") + def insert_sqlite_hook(): + sqlite_hook = SqliteHook() + + rows = [('James', '11'), ('James', '22'), ('James', '33')] + target_fields = ['first_name', 'last_name'] + sqlite_hook.insert_rows(table='Customers', rows=rows, target_fields=target_fields) + + @dag.task(task_id="replace_sqlite_task") + def replace_sqlite_hook(): + sqlite_hook = SqliteHook() + + rows = [('James', '11'), ('James', '22'), ('James', '33')] + target_fields = ['first_name', 'last_name'] + sqlite_hook.insert_rows(table='Customers', rows=rows, target_fields=target_fields, replace=True) + + # [START howto_operator_sqlite_external_file] + + # Example of creating a task that calls an sql command from an external file. + external_create_table_sqlite_task = SqliteOperator( + task_id='create_table_sqlite_external_file', + sql='create_table.sql', + ) + + # [END howto_operator_sqlite_external_file] + + ( + create_table_sqlite_task + >> external_create_table_sqlite_task + >> insert_sqlite_hook() + >> replace_sqlite_hook() + ) + + from tests.system.utils.watcher import watcher + + # This test needs watcher in order to properly mark success/failure + # when "tearDown" task with trigger rule is part of the DAG + list(dag.tasks) >> watcher() + +from tests.system.utils import get_test_run # noqa: E402 + +# Needed to run the example DAG with pytest (see: tests/system/README.md#run_via_pytest) +test_run = get_test_run(dag)