Модуль источников данных sql
=========================================

.. py:module:: axioma.core.sql
.. currentmodule:: axioma.core.sql

В данном модуле содержатся классы и методы для выполнения локальных sql запросов

Список классов
--------------

.. toctree::
	:glob:

	sql/*


Функции выполнения SQL запросов
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	.. note:: При вызове версий функций, не имеющих среду выполнения запросов \
		:class:`~axioma.core.sql.SqlRuntime` в качестве одного из своих параметров, \
		будет произведена попытка ее получения из инициализированного ядра \
		приложения :class:`~axioma.core.Core`

	.. function:: selectAsTable(query_text, context, runtime)

		Выполнить запрос к таблицам и получить результат в виде таблицы

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:param runtime: среда выполнения запросов
		:type runtime: :class:`~axioma.core.sql.SqlRuntime`
		:return: таблица, представляющая результат запроса
		:rtype: :class:`~axioma.core.sql.QueryTable`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения

	.. function:: selectAsTable(query_text, context)

		Выполнить запрос к таблицам и получить результат в виде таблицы

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:return: таблица, представляющая результат запроса
		:rtype: :class:`~axioma.core.sql.QueryTable`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения

		.. code-block:: python
			:caption: Пример использования
			:name: axioma.core.sql.selectAtTable.code_sample

			# Запрос всех стран с названием 'Hungary'
			from axioma.core.sql import *

			# ...
			# table - Таблица 'world'
			# ...

			# создадим контекст
			context = SimpleTableContext(table)

			# SELECT AS TABLE
			query_text = "SELECT * FROM world WHERE country=\"Hungary\""
			select_table = selectAsTable(query_text, context)

			print("Имя таблицы выборки: %s" % select_table.name())
			print("Количество записей: %d" % len(select_table.allFeatures()))
			print("Количество атрибутов: %d" % len(select_table.attributeNames()))

			# Вывод:
			# >>> Имя таблицы выборки: Query
			# >>> Количество записей: 1
			# >>> Количество атрибутов: 32

	.. function:: select(query_text, context, runtime)

		Запрос типа "Выборка" (SELECT)

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:param runtime: среда выполнения запросов
		:type runtime: :class:`~axioma.core.sql.SqlRuntime`
		:return: результат выполнения запроса
		:rtype: :class:`~axioma.core.sql.QueryResult`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения

	.. function:: select(query_text, context)

		Запрос типа "Выборка" (SELECT)

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:return: результат выполнения запроса
		:rtype: :class:`~axioma.core.sql.QueryResult`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения

		.. code-block:: python
			:caption: Пример использования
			:name: axioma.core.sql.select.code_sample

			# Страны с населением более 100 миллионов
			from axioma.core.sql import *

			# ...
			# table - Таблица 'world'
			# ...

			# создадим контекст
			context = SimpleTableContext(table)

			# SELECT
			query_text = "SELECT Страна FROM world WHERE Население>100000000"
			select_table = selectAsTable(query_text, context)

			result = select(query_text, context)

			print([feature.getAttribute("Страна") for feature in result.features])

			# Вывод:
			# >>> ['Бангладеш', 'Бразилия', 'Китай', 'Индия', 'Индонезия',
			#      'Япония', 'Российская Федерация', 'Соединенные Штаты Америки']

	.. function:: update(query_text, context, runtime)

		Запрос типа "Изменение" (UPDATE)

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:param runtime: среда выполнения запросов
		:type runtime: :class:`~axioma.core.sql.SqlRuntime`
		:return: количество измененных записей
		:rtype: :class:`int`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения

	.. function:: update(query_text, context)

		Запрос типа "Изменение" (UPDATE)

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:param runtime: среда выполнения запросов
		:type runtime: :class:`~axioma.core.sql.SqlRuntime`
		:return: количество измененных записей
		:rtype: :class:`int`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения
		
		
		.. code-block:: python
			:caption: Изменение данных в таблице

			try:
			    query_update = 'UPDATE world SET Грамотность = 99 WHERE Континент = "Африка"'
			    res = update(query_update, context)
			    print('Изменено записей {}'.format(res))
			    table.commit() # Сохранение данных в файле
			except RuntimeException as ex:
			    print("Ошибка: %s" % ex)

		.. code-block:: python
			:caption: Пример с демонстрацией исключения 'Неизвестная колонка'
			:name: axioma.core.sql.update.code_sample

			from axioma.core.sql import *
			from axioma.common import RuntimeException

			# ...
			# context - Контекст таблиц, содержащий таблицу 'world'
			# ...

			try:
				query_text = 'UPDATE world SET {0}=\"{2}\" WHERE {0}=\"{1}\"'.format("a", "b", "c")
				res = update(query_text, context)
			except RuntimeException as ex:
				print("Ошибка: %s" % ex)

			# Вывод:
			# >>> Ошибка: Столбец 'a' не найден

	.. function:: remove(query_text, context, runtime)

		Запрос типа "Удаление" (DELETE)

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:param runtime: среда выполнения запросов
		:type runtime: :class:`~axioma.core.sql.SqlRuntime`
		:return: количество удаленных записей
		:rtype: :class:`int`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения

	.. function:: remove(query_text, context)

		Запрос типа "Удаление" (DELETE)

		:param query_text: текст запроса
		:type query_text: :class:`str`
		:param context: контекст таблиц
		:type context: :class:`~axioma.core.sql.TableContext`
		:param runtime: среда выполнения запросов
		:type runtime: :class:`~axioma.core.sql.SqlRuntime`
		:return: количество удаленных записей
		:rtype: :class:`int`
		:raises Runtime: :exc:`~axioma.common.RuntimeException` - Ошибка времени выполнения
		
		.. code-block:: python
			:caption: Пример удаления данных из таблицы по условию

			try:
			    query_delete = 'DELETE FROM world WHERE Грамотность < 10'
			    res = remove(query_delete, context)
			    print('Удалено записей {}'.format(res))
			except RuntimeException as ex:
			    print("Ошибка: %s" % ex)
