.. highlight:: pycon+sql

.. |prev| replace:: :doc:`metadata`
.. |next| replace:: :doc:`data_insert`

.. include:: tutorial_nav_include.rst

.. _tutorial_working_with_data:

Working with Data
==================

In :ref:`tutorial_working_with_transactions`, we learned the basics of how to
interact with the Python DBAPI and its transactional state.  Then, in
:ref:`tutorial_working_with_metadata`, we learned how to represent database
tables, columns, and constraints within SQLAlchemy using the
:class:`_schema.MetaData` and related objects.  In this section we will combine
both concepts above to create, select and manipulate data within a relational
database.   Our interaction with the database is **always** in terms
of a transaction, even if we've set our database driver to use :ref:`autocommit
<dbapi_autocommit>` behind the scenes.

The components of this section are as follows:

* :ref:`tutorial_core_insert` - to get some data into the database, we introduce
  and demonstrate the Core :class:`_sql.Insert` construct.   INSERTs from an
  ORM perspective are described in the next section
  :ref:`tutorial_orm_data_manipulation`.

* :ref:`tutorial_selecting_data` - this section will describe in detail
  the :class:`_sql.Select` construct, which is the most commonly used object
  in SQLAlchemy.  The :class:`_sql.Select` construct emits SELECT statements
  for both Core and ORM centric applications and both use cases will be
  described here.   Additional ORM use cases are also noted in the later
  section :ref:`tutorial_select_relationships` as well as the
  :ref:`queryguide_toplevel`.

* :ref:`tutorial_core_update_delete` - Rounding out the INSERT and SELECTion
  of data, this section will describe from a Core perspective the use of the
  :class:`_sql.Update` and :class:`_sql.Delete` constructs.  ORM-specific
  UPDATE and DELETE is similarly described in the
  :ref:`tutorial_orm_data_manipulation` section.


.. toctree::
    :hidden:
    :maxdepth: 10

    data_insert
    data_select
    data_update
