From 1bd13528615da6d043c8afd6a43f2f6a3cdbd742 Mon Sep 17 00:00:00 2001 From: Kai Mueller Date: Mon, 16 Oct 2023 08:52:59 +0000 Subject: [PATCH] Consolidate docs in README file This removes the docs folder which was not used anyways --- README.rst | 220 +++++++++++++++++++++++++++++++++++++++++++++---- docs/Makefile | 20 ----- docs/conf.py | 177 --------------------------------------- docs/index.rst | 219 ------------------------------------------------ 4 files changed, 203 insertions(+), 433 deletions(-) delete mode 100644 docs/Makefile delete mode 100644 docs/conf.py delete mode 100644 docs/index.rst diff --git a/README.rst b/README.rst index 3232b23..4b7dbaa 100644 --- a/README.rst +++ b/README.rst @@ -5,20 +5,17 @@ SQLAlchemy dialect for SAP HANA :target: https://api.reuse.software/info/github.com/SAP/sqlalchemy-hana This dialect allows you to use the SAP HANA database with SQLAlchemy. -It can use the supported SAP HANA Python Driver `hdbcli` (supported since SAP HANA SPS 2) or the -open-source pure Python client `PyHDB`. Please notice that sqlalchemy-hana isn't an official SAP -product and isn't covered by SAP support. +It uses ``hdbcli`` to connect to SAP HANA. +Please notice that sqlalchemy-hana isn't an official SAP product and isn't covered by SAP support. Prerequisites ------------- - -Python 2.7 or Python 3.X with installed SAP HANA DBAPI implementation. - -SAP HANA Python Driver see `SAP HANA Client Interface Programming Reference `_ or the install section of `PyHDB `_. +* Python 3.8+ +* SQLAlchemy 1.4 or 2.x +* `hdbcli `_ Install ------- - Install from Python Package Index: .. code-block:: bash @@ -36,8 +33,8 @@ You can also install the latest version direct from a cloned git repository. Getting started --------------- - -If you do not have access to a SAP HANA server, you can also use the `SAP HANA Express edition `_. +If you do not have access to a SAP HANA server, you can also use the +`SAP HANA Express edition `_. After installation of sqlalchemy-hana, you can create a engine which connects to a SAP HANA instance. This engine works like all other engines of SQLAlchemy. @@ -47,7 +44,8 @@ instance. This engine works like all other engines of SQLAlchemy. from sqlalchemy import create_engine engine = create_engine('hana://username:password@example.de:30015') -Alternatively, you can use HDB User Store to avoid entering connection-related information manually each time you want to establish a connection to an SAP HANA database: +Alternatively, you can use HDB User Store to avoid entering connection-related information manually +each time you want to establish a connection to an SAP HANA database: .. code-block:: python @@ -67,12 +65,200 @@ In case of a tenant database, you may use: from sqlalchemy import create_engine engine = engine = create_engine('hana://user:pass@host/tenant_db_name') -Contribute ----------- +Usage +----- -If you found bugs or have other issues, you are welcome to create a GitHub Issue. If you have questions about usage or something similar please create a `Stack Overflow `_ Question with tag `sqlalchemy `_ and `hana `_. +Special CREATE TABLE argument +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Sqlalchemy-hana provides a special argument called “hana_table_type” which can be used to +specify the type of table one wants to create with SAP HANA (i.e. ROW/COLUMN). +The default table type depends on your SAP HANA configuration and version. -License -------- +.. code-block:: python + + t = Table('my_table', metadata, Column('id', Integer), hana_table_type = 'COLUMN') + t.create(engine) + +Case Sensitivity +~~~~~~~~~~~~~~~~ +In SAP HANA, all case insensitive identifiers are represented using uppercase text. +In SQLAlchemy on the other hand all lower case identifier names are considered to be case insensitive. +The sqlalchemy-hana dialect converts all case insensitive and case sensitive identifiers to the +right casing during schema level communication. +In the sqlalchemy-hana dialect, using an uppercase name on the SQLAlchemy side indicates a case +sensitive identifier, and SQLAlchemy will quote the name,which may cause case mismatches between +data received from SAP HANA. +Unless identifier names have been truly created as case sensitive (i.e. using quoted names), +all lowercase names should be used on the SQLAlchemy side. + +Auto Increment Behavior +~~~~~~~~~~~~~~~~~~~~~~~ +SQLAlchemy Table objects which include integer primary keys are usually assumed to have +“auto incrementing” behavior, which means that primary key values can be automatically generated +upon INSERT. +Since SAP HANA has no auto-increment feature, SQLAlchemy relies upon sequences to automatically +generate primary key values. + +Sequences +""""""""" +With the sqlalchemy-hana dialect, a sequence must be explicitly specified to enable +auto-incrementing behavior. +This is different than the majority of SQLAlchemy documentation examples which assume the usage of +an auto-increment-capable database. +To create sequences, use the sqlalchemy.schema.Sequence object which is passed to a ``Column`` construct. + +.. code-block:: python + + t = Table('my_table', metadata, Column('id', Integer, Sequence('id_seq'), primary key=True)) + t.create(engine) + +IDENTITY Feature +"""""""""""""""" +SAP HANA also comes with an option to have an ``IDENTITY`` column which can also be used to create +new primary key values for integer-based primary key columns. +Built-in support for rendering of ``IDENTITY`` is not available yet, however the following compilation +hook may be used to make use of +the IDENTITY feature. + +.. code-block:: python + + from sqlalchemy.schema import CreateColumn + from sqlalchemy.ext.compiler import compiles + + @compiles(CreateColumn, 'hana') + def use_identity(element, compiler, **kw): + text = compiler.visit_create_column(element, **kw) + text = text.replace('NOT NULL', 'NOT NULL GENERATED BY DEFAULT AS IDENTITY') + return text + + t = Table('t', meta, Column('id', Integer, primary_key=True), Column('data', String)) + + t.create(engine) + +LIMIT/OFFSET Support +~~~~~~~~~~~~~~~~~~~~ +SAP HANA supports both ``LIMIT`` and ``OFFSET``, but it only supports ``OFFSET`` in conjunction with ``LIMIT`` +i.e. in the select statement the offset parameter cannot be set without the ``LIMIT`` clause, +hence in sqlalchemy-hana if the user tries to use offset without limit, a limit of 2147384648 would +be set, this has been done so that the users can smoothly use ``LIMIT`` or ``OFFSET`` as in other +databases that do not have this limitation. +2147384648 was chosen, because it is the maximum number of records per result set. + +RETURNING Support +~~~~~~~~~~~~~~~~~ +Sqlalchemy-hana does not support ``RETURNING`` in the ``INSERT``, ``UPDATE`` and ``DELETE`` +statements to retrieve result sets of matched rows from ``INSERT``, ``UPDATE`` and ``DELETE`` +statements because newly generated primary key values are neither fetched nor returned automatically +in SAP HANA and SAP HANA does not support the syntax ``INSERT... RETURNING...``. + +Constraint Reflection +~~~~~~~~~~~~~~~~~~~~ +The sqlalchemy-hana dialect can return information about foreign keys, unique constraints and +check constraints, as well as table indexes. + +Raw information regarding these constraints can be acquired using: + +* Inspector.get_foreign_keys() +* Inspector.get_unique_constraints() +* Inspector.get_check_constraints() +* Inspector.get_indexes() -Copyright (c) 2015-2021 SAP SE or an SAP affiliate company and sqlalchemy-hana contributors. Please see our `LICENSE file `__ for copyright and license information. Detailed information including third-party components and their licensing/copyright information is available `via the REUSE tool `__. +When using refection at the table level, the table will also include these constraints. + +Foreign key Options +""""""""""""""""""" +In SAP HANA the following ``UPDATE`` and ``DELETE`` foreign key referential actions are available: + +* RESTRICT +* CASCADE +* SET NULL +* SET DEFAULT + +The foreign key referential option ``NO ACTION`` does not exist in SAP HANA. +The default is ``RESTRICT``. + +CHECK Constraints +""""""""""""""""" +Table level check constraints can be created as well as reflected in the sqlalchemy-hana dialect. +Column level check constraints are not available in SAP HANA. + +.. code-block:: python + + t = Table('my_table', metadata, Column('id', Integer), Column(...), ..., CheckConstraint('id >5', name='my_check_const')) + +UNIQUE Constraints +"""""""""""""""""" +For each unique constraint an index is created in SAP HANA, this may lead to unexpected behavior +in programs using reflection. + +Special Reflection Option +~~~~~~~~~~~~~~~~~~~~~~~~ +The Inspector used for the SAP HANA database is an instance of ``HANAInspector`` and offers an +additional method. + +get_table_oid(table name, schema=None) +"""""""""""""""""""""""""""""""""""""" +Return the OID (object id) for the given table name. + +.. code-block:: python + + from sqlalchemy import create_engine, inspect + + engine = create_engine("hana://username:password@example.de:30015") + insp = inspect(engine) + # will be a HANAInspector + print(insp.get_table_oid('my_table')) + +Data types +~~~~~~~~~~ + +As with all SQLAlchemy dialects, all UPPERCASE types that are known to be valid with SAP HANA are +importable from the top level dialect, whether they originate from sqlalchemy types or from the +local dialect. +The allowed data types for sqlalchemy-hana are as follows: + +* BOOLEAN +* NUMERIC +* NVARCHAR +* CLOB +* BLOB +* DATE +* TIME +* TIMESTAMP +* CHAR +* VARCHAR +* VARBINARY +* BIGINT +* SMALLINT +* INTEGER +* FLOAT +* TEXT + +DateTime Compatibility +"""""""""""""""""""""" +SAP HANA has no data type known as ``DATETIME``, it instead has the datatype ``TIMESTAMP``, which can +actually store the date and time value. +For this reason, the sqlalchemy-hana dialect provides a ``TIMESTAMP`` type which is a ```datetime``. + +NUMERIC Compatibility +""""""""""""""""""""" +SAP HANA does not have a data type known as ``NUMERIC``, hence if a user has a column with data type +numeric while using sqlalchemy-hana, it is stored as ``DECIMAL`` data type instead. + +TEXT datatype +""""""""""""" +SAP HANA only supports the datatype ``TEXT`` for column tables. +It is not a valid data type for row tables. Hence, one must mention ``hana_table_type="COLUMN"`` + +Bound Parameter Styles +~~~~~~~~~~~~~~~~~~~~~~ +The default parameter style for the sqlalchemy-hana dialect is ``qmark``, where SQL is rendered +using the following style: + +.. code-block:: sql + + WHERE my_column = ? + +Contribute +---------- +If you found bugs or have other issues, you are welcome to create a GitHub Issue diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 8070838..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = sqlalchemy-hana -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index b2c3e69..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -# -# sqlalchemy-hana documentation build configuration file, created by -# sphinx-quickstart on Fri Feb 2 14:04:59 2018. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -from __future__ import annotations - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ["sphinx.ext.autodoc", "sphinx.ext.intersphinx"] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "sqlalchemy-hana" -copyright = "2018, SAP SE" -author = "Christoph Heer" - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = "0.4.0" -# The full version, including alpha/beta/rc tags. -release = "0.4.0.dev" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "alabaster" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -html_sidebars = { - "**": [ - "relations.html", # needs 'show_related': True theme option to display - "searchbox.html", - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = "sqlalchemy-hanadoc" - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - master_doc, - "sqlalchemy-hana.tex", - "sqlalchemy-hana Documentation", - "Christoph Heer", - "manual", - ), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, "sqlalchemy-hana", "sqlalchemy-hana Documentation", [author], 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "sqlalchemy-hana", - "sqlalchemy-hana Documentation", - author, - "sqlalchemy-hana", - "One line description of project.", - "Miscellaneous", - ), -] - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index 1b94d5a..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,219 +0,0 @@ -sqlalchemy-hana documentation -============================= - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - -This dialect allows you to use the SAP HANA database with SQLAlchemy. -It can use the supported SAP HANA Python Driver `hdbcli` (supported since SAP HANA SPS 2) or the open-source pure Python client `PyHDB`. Please notice that sqlalchemy-hana is not an official SAP product and is not covered by SAP support. - -Prerequisites -------------- - -Python 2.7 or Python 3 with installed SAP HANA DBAPI implementation. - -SAP HANA Python Driver see `SAP HANA Client Interface Programming Reference `_ or the install section of `PyHDB `_. - -Install -------- - -Install from Python Package Index: - -.. code-block:: bash - - $ pip install sqlalchemy-hana - -You can also install the latest version directly from a cloned git repository. - -.. code-block:: bash - - $ git clone https://github.com/SAP/sqlalchemy-hana.git - $ cd sqlalchemy-hana - $ python setup.py install - - -Getting started ---------------- - -If you do not have access to a SAP HANA server, you can also use the `SAP HANA Express edition `_. - -After installation of sqlalchemy-hana, you can create an engine which connects to a SAP HANA instance. This engine works like all other engines of SQLAlchemy. - -.. code-block:: python - - from sqlalchemy import create_engine - engine = create_engine('hana://username:password@example.de:30015') - -In case of a tenant database, you may use: - -.. code-block:: python - - from sqlalchemy import create_engine - engine = engine = create_engine('hana://user:pass@host/tenant_db_name') - -Special CREATE TABLE argument ------------------------------ - -Sqlalchemy-hana provides a special argument called “hana_table_type” which can be used to specify the type of table one wants to create with SAP HANA (i.e. ROW/COLUMN). The default table type depends on your HANA configuration. - -.. code-block:: python - - t = Table('mytable', metadata, Column('id', Integer), hana_table_type = 'COLUMN') - t.create(engine) - -Case Sensitivity ----------------- - -In SAP HANA, all case insensitive identifiers are represented using uppercase text. In SQLAlchemy on the other hand all lower case identifier names are considered to be case insensitive. The sqlalchemy-hana dialect converts all case insensitive and case sensitive identifiers to the right casing during schema level communication. In the sqlalchemy-hana dialect, using an uppercase name on the SQLAlchemy side indicates a case sensitive identifier, and SQLAlchemy will quote the name,which may cause case mismatches between data received from SAP HANA. Unless identifier names have been truly created as case sensitive (i.e. using quoted names), all lowercase names should be used on the SQLAlchemy side. - -Auto Increment Behavior ------------------------ - -SQLAlchemy Table objects which include integer primary keys are usually assumed to have “auto incrementing” behavior, which means that primary key values can be automatically generated upon INSERT. Since SAP HANA has no “autoincrement” feature, SQLAlchemy relies upon sequences to automatically generate primary key values. - -Sequences -""""""""" - -With the sqlalchemy-hana dialect, a sequence must be explicitly specified to enable autoincrementing behaviour. This is different than the majority of SQLAlchemy documentation examples which assume the usage of an autoincrement-capable database. To create sequences, use the sqlalchemy.schema.Sequence object which is passed to a Column construct. - -.. code-block:: python - - t = Table('mytable', metadata, Column('id', Integer, Sequence('id_seq'), primary key=True)) - t.create(engine) - -IDENTITY Feature -"""""""""""""""" - -SAP HANA also comes with an option to have an IDENTITY column which can also be used to create new primary key values for integer-based primary key columns. Built-in support for rendering of IDENTITY is not available yet, however the following compilation hook may be used to make use of the IDENTITY feature. - -.. code-block:: python - - from sqlalchemy.schema import CreateColumn - from sqlalchemy.ext.compiler import compiles - - @compiles(CreateColumn, 'hana') - def use_identity(element, compiler, **kw): - text = compiler.visit_create_column(element, **kw) - text = text.replace('NOT NULL', 'NOT NULL GENERATED BY DEFAULT AS IDENTITY') - return text - - t = Table('t', meta, Column('id', Integer, primary_key=True), Column('data', String)) - - t.create(engine) - -LIMIT/OFFSET Support --------------------- - -SAP HANA supports both LIMIT and OFFSET, but it only supports OFFSET in conjunction with LIMIT i.e. in the select statement the offset parameter cannot be set without the LIMIT clause, hence in sqlalchemy-hana if the user tries to use offset without limit, a limit of 2147384648 would be set, this has been done so that the users can smoothly use LIMIT/OFFSET as in other databases that do not have this limitation. 2147384648 was chosen, because it is the maximum number of records per result set. - -RETURNING Support ------------------ - -Sqlalchemy-hana does not support RETURNING in the INSERT, UPDATE and DELETE statements to retrieve result sets of matched rows from INSERT, UPDATE and DELETE statements because newly generated primary key values are neither fetched nor returned automatically in SAP HANA and SAP HANA does not support the syntax: INSERT... RETURNING... - -Constraint Reflection --------------------- - -The sqlalchemy-hana dialect can return information about foreign keys, unique constraints and check constraints, as well as table indexes. - -Raw information regarding these constraints can be acquired using: - -* Inspector.get_foreign_keys() -* Inspector.get_unique_constraints() -* Inspector.get_check_constraints() -* Inspector.get_indexes() - -When using reflection at the Table level, the Table will also include these constraints. - -Foreign key Options -""""""""""""""""""" - -In SAP HANA the following UPDATE and DELETE foreign key referential actions are available: - -* RESTRICT -* CASCADE -* SET NULL -* SET DEFAULT - -The foreign key referential option NO ACTION does not exist in SAP HANA. The default is RESTRICT. - -CHECK Constraints -""""""""""""""""" - -Table level check constraints can be created as well as reflected in the sqlalchemy-hana dialect. Column level check constraints are not available in SAP HANA. - -.. code-block:: python - - t = Table('mytable', metadata, Column('id', Integer), Column(...), ..., CheckConstraint('id >5', name='my_check_const')) - -UNIQUE Constraints -"""""""""""""""""" - -For each unique constraint an index is created in SAP HANA, this may lead to unexpected behaviour in programs using reflection. - -Special Reflection Option ------------------------- - -The Inspector used for the SAP HANA database is an instance of HANA Inspector and offers an additional method. - -get_table_oid(table name, schema=None) -"""""""""""""""""""""""""""""""""""""" - -Return the OID(object id) for the given table name. - -.. code-block:: python - - from sqlalchemy import create_engine, inspect - - engine = create_engine("hana://username:password@example.de:30015") - insp = inspect(engine) - # will be a HANAInspector - print(insp.get_table_oid('mytable')) - -Data types ----------- - -As with all SQLAlchemy dialects, all UPPERCASE types that are known to be valid with SAP HANA are importable from the top level dialect, whether they originate from sqlalchemy.types or from the local dialect. The allowed datatypes for sqlalchemy-hana are as follows: - -BOOLEAN, NUMERIC, NVARCHAR, CLOB, BLOB, DATE, TIME, TIMESTAMP, CHAR, VARCHAR, VARBINARY, BIGINT, SMALLINT, INTEGER, FLOAT, TEXT - -DateTime Compatibility -"""""""""""""""""""""" - -SAP HANA has no data type known as DATETIME, it instead has the datatype TIMESTAMP, which can actually store the date and time value. For this reason, the sqlalchemy-hana dialect provides a type sqlalchemy-hana.TIMESTAMP which is a subclass of DateTime. - -NUMERIC Compatibility -""""""""""""""""""""" - -SAP HANA does not have a data type known as NUMERIC, hence if a user has a column with data type numeric while using sqlalchemy-hana, it is stored as DECIMAL data type instead. - -TEXT datatype -""""""""""""" - -SAP HANA only supports the datatype TEXT for column tables. It is not a valid data type for row tables. Hence, one must mention hana_table_type=‘COLUMN’ - -Bound Parameter Styles ----------------------- - -The default parameter style for the sqlalchemy-hana dialect is “qmark”, where SQL is rendered using the following style: - -WHERE my_column = ? - -Contribute ----------- - -If you found bugs or have other issues, you are welcome to create a GitHub Issue. -If you have questions about usage or something similar please create a -`Stack Overflow `_ question with tag -`sqlalchemy `_ and -`hana `_. - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search`