17db96d56Sopenharmony_ci:mod:`sqlite3` --- DB-API 2.0 interface for SQLite databases
27db96d56Sopenharmony_ci============================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: sqlite3
57db96d56Sopenharmony_ci   :synopsis: A DB-API 2.0 implementation using SQLite 3.x.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. sectionauthor:: Gerhard Häring <gh@ghaering.de>
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci**Source code:** :source:`Lib/sqlite3/`
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci.. Make sure we always doctest the tutorial with an empty database.
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci.. testsetup::
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci   import sqlite3
167db96d56Sopenharmony_ci   src = sqlite3.connect(":memory:", isolation_level=None)
177db96d56Sopenharmony_ci   dst = sqlite3.connect("tutorial.db", isolation_level=None)
187db96d56Sopenharmony_ci   src.backup(dst)
197db96d56Sopenharmony_ci   del src, dst
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci.. _sqlite3-intro:
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ciSQLite is a C library that provides a lightweight disk-based database that
247db96d56Sopenharmony_cidoesn't require a separate server process and allows accessing the database
257db96d56Sopenharmony_ciusing a nonstandard variant of the SQL query language. Some applications can use
267db96d56Sopenharmony_ciSQLite for internal data storage.  It's also possible to prototype an
277db96d56Sopenharmony_ciapplication using SQLite and then port the code to a larger database such as
287db96d56Sopenharmony_ciPostgreSQL or Oracle.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ciThe :mod:`!sqlite3` module was written by Gerhard Häring.  It provides an SQL interface
317db96d56Sopenharmony_cicompliant with the DB-API 2.0 specification described by :pep:`249`, and
327db96d56Sopenharmony_cirequires SQLite 3.7.15 or newer.
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ciThis document includes four main sections:
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci* :ref:`sqlite3-tutorial` teaches how to use the :mod:`!sqlite3` module.
377db96d56Sopenharmony_ci* :ref:`sqlite3-reference` describes the classes and functions this module
387db96d56Sopenharmony_ci  defines.
397db96d56Sopenharmony_ci* :ref:`sqlite3-howtos` details how to handle specific tasks.
407db96d56Sopenharmony_ci* :ref:`sqlite3-explanation` provides in-depth background on
417db96d56Sopenharmony_ci  transaction control.
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci.. seealso::
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci   https://www.sqlite.org
467db96d56Sopenharmony_ci      The SQLite web page; the documentation describes the syntax and the
477db96d56Sopenharmony_ci      available data types for the supported SQL dialect.
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci   https://www.w3schools.com/sql/
507db96d56Sopenharmony_ci      Tutorial, reference and examples for learning SQL syntax.
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci   :pep:`249` - Database API Specification 2.0
537db96d56Sopenharmony_ci      PEP written by Marc-André Lemburg.
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci.. We use the following practises for SQL code:
577db96d56Sopenharmony_ci   - UPPERCASE for keywords
587db96d56Sopenharmony_ci   - snake_case for schema
597db96d56Sopenharmony_ci   - single quotes for string literals
607db96d56Sopenharmony_ci   - singular for table names
617db96d56Sopenharmony_ci   - if needed, use double quotes for table and column names
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci.. _sqlite3-tutorial:
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ciTutorial
667db96d56Sopenharmony_ci--------
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ciIn this tutorial, you will create a database of Monty Python movies
697db96d56Sopenharmony_ciusing basic :mod:`!sqlite3` functionality.
707db96d56Sopenharmony_ciIt assumes a fundamental understanding of database concepts,
717db96d56Sopenharmony_ciincluding `cursors`_ and `transactions`_.
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ciFirst, we need to create a new database and open
747db96d56Sopenharmony_cia database connection to allow :mod:`!sqlite3` to work with it.
757db96d56Sopenharmony_ciCall :func:`sqlite3.connect` to create a connection to
767db96d56Sopenharmony_cithe database :file:`tutorial.db` in the current working directory,
777db96d56Sopenharmony_ciimplicitly creating it if it does not exist:
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci.. testcode::
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci   import sqlite3
827db96d56Sopenharmony_ci   con = sqlite3.connect("tutorial.db")
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ciThe returned :class:`Connection` object ``con``
857db96d56Sopenharmony_cirepresents the connection to the on-disk database.
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ciIn order to execute SQL statements and fetch results from SQL queries,
887db96d56Sopenharmony_ciwe will need to use a database cursor.
897db96d56Sopenharmony_ciCall :meth:`con.cursor() <Connection.cursor>` to create the :class:`Cursor`:
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci.. testcode::
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci   cur = con.cursor()
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ciNow that we've got a database connection and a cursor,
967db96d56Sopenharmony_ciwe can create a database table ``movie`` with columns for title,
977db96d56Sopenharmony_cirelease year, and review score.
987db96d56Sopenharmony_ciFor simplicity, we can just use column names in the table declaration --
997db96d56Sopenharmony_cithanks to the `flexible typing`_ feature of SQLite,
1007db96d56Sopenharmony_cispecifying the data types is optional.
1017db96d56Sopenharmony_ciExecute the ``CREATE TABLE`` statement
1027db96d56Sopenharmony_ciby calling :meth:`cur.execute(...) <Cursor.execute>`:
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci.. testcode::
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci   cur.execute("CREATE TABLE movie(title, year, score)")
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci.. Ideally, we'd use sqlite_schema instead of sqlite_master below,
1097db96d56Sopenharmony_ci   but SQLite versions older than 3.33.0 do not recognise that variant.
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ciWe can verify that the new table has been created by querying
1127db96d56Sopenharmony_cithe ``sqlite_master`` table built-in to SQLite,
1137db96d56Sopenharmony_ciwhich should now contain an entry for the ``movie`` table definition
1147db96d56Sopenharmony_ci(see `The Schema Table`_ for details).
1157db96d56Sopenharmony_ciExecute that query by calling :meth:`cur.execute(...) <Cursor.execute>`,
1167db96d56Sopenharmony_ciassign the result to ``res``,
1177db96d56Sopenharmony_ciand call :meth:`res.fetchone() <Cursor.fetchone>` to fetch the resulting row:
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci.. doctest::
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci   >>> res = cur.execute("SELECT name FROM sqlite_master")
1227db96d56Sopenharmony_ci   >>> res.fetchone()
1237db96d56Sopenharmony_ci   ('movie',)
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ciWe can see that the table has been created,
1267db96d56Sopenharmony_cias the query returns a :class:`tuple` containing the table's name.
1277db96d56Sopenharmony_ciIf we query ``sqlite_master`` for a non-existent table ``spam``,
1287db96d56Sopenharmony_ci:meth:`!res.fetchone()` will return ``None``:
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci.. doctest::
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci   >>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
1337db96d56Sopenharmony_ci   >>> res.fetchone() is None
1347db96d56Sopenharmony_ci   True
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ciNow, add two rows of data supplied as SQL literals
1377db96d56Sopenharmony_ciby executing an ``INSERT`` statement,
1387db96d56Sopenharmony_cionce again by calling :meth:`cur.execute(...) <Cursor.execute>`:
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci.. testcode::
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci   cur.execute("""
1437db96d56Sopenharmony_ci       INSERT INTO movie VALUES
1447db96d56Sopenharmony_ci           ('Monty Python and the Holy Grail', 1975, 8.2),
1457db96d56Sopenharmony_ci           ('And Now for Something Completely Different', 1971, 7.5)
1467db96d56Sopenharmony_ci   """)
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ciThe ``INSERT`` statement implicitly opens a transaction,
1497db96d56Sopenharmony_ciwhich needs to be committed before changes are saved in the database
1507db96d56Sopenharmony_ci(see :ref:`sqlite3-controlling-transactions` for details).
1517db96d56Sopenharmony_ciCall :meth:`con.commit() <Connection.commit>` on the connection object
1527db96d56Sopenharmony_cito commit the transaction:
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci.. testcode::
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci   con.commit()
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ciWe can verify that the data was inserted correctly
1597db96d56Sopenharmony_ciby executing a ``SELECT`` query.
1607db96d56Sopenharmony_ciUse the now-familiar :meth:`cur.execute(...) <Cursor.execute>` to
1617db96d56Sopenharmony_ciassign the result to ``res``,
1627db96d56Sopenharmony_ciand call :meth:`res.fetchall() <Cursor.fetchall>` to return all resulting rows:
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci.. doctest::
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci   >>> res = cur.execute("SELECT score FROM movie")
1677db96d56Sopenharmony_ci   >>> res.fetchall()
1687db96d56Sopenharmony_ci   [(8.2,), (7.5,)]
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ciThe result is a :class:`list` of two :class:`!tuple`\s, one per row,
1717db96d56Sopenharmony_cieach containing that row's ``score`` value.
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ciNow, insert three more rows by calling
1747db96d56Sopenharmony_ci:meth:`cur.executemany(...) <Cursor.executemany>`:
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci.. testcode::
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci   data = [
1797db96d56Sopenharmony_ci       ("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
1807db96d56Sopenharmony_ci       ("Monty Python's The Meaning of Life", 1983, 7.5),
1817db96d56Sopenharmony_ci       ("Monty Python's Life of Brian", 1979, 8.0),
1827db96d56Sopenharmony_ci   ]
1837db96d56Sopenharmony_ci   cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
1847db96d56Sopenharmony_ci   con.commit()  # Remember to commit the transaction after executing INSERT.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ciNotice that ``?`` placeholders are used to bind ``data`` to the query.
1877db96d56Sopenharmony_ciAlways use placeholders instead of :ref:`string formatting <tut-formatting>`
1887db96d56Sopenharmony_cito bind Python values to SQL statements,
1897db96d56Sopenharmony_cito avoid `SQL injection attacks`_
1907db96d56Sopenharmony_ci(see :ref:`sqlite3-placeholders` for more details).
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ciWe can verify that the new rows were inserted
1937db96d56Sopenharmony_ciby executing a ``SELECT`` query,
1947db96d56Sopenharmony_cithis time iterating over the results of the query:
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci.. doctest::
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci   >>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
1997db96d56Sopenharmony_ci   ...     print(row)
2007db96d56Sopenharmony_ci   (1971, 'And Now for Something Completely Different')
2017db96d56Sopenharmony_ci   (1975, 'Monty Python and the Holy Grail')
2027db96d56Sopenharmony_ci   (1979, "Monty Python's Life of Brian")
2037db96d56Sopenharmony_ci   (1982, 'Monty Python Live at the Hollywood Bowl')
2047db96d56Sopenharmony_ci   (1983, "Monty Python's The Meaning of Life")
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ciEach row is a two-item :class:`tuple` of ``(year, title)``,
2077db96d56Sopenharmony_cimatching the columns selected in the query.
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ciFinally, verify that the database has been written to disk
2107db96d56Sopenharmony_ciby calling :meth:`con.close() <Connection.close>`
2117db96d56Sopenharmony_cito close the existing connection, opening a new one,
2127db96d56Sopenharmony_cicreating a new cursor, then querying the database:
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci.. doctest::
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci   >>> con.close()
2177db96d56Sopenharmony_ci   >>> new_con = sqlite3.connect("tutorial.db")
2187db96d56Sopenharmony_ci   >>> new_cur = new_con.cursor()
2197db96d56Sopenharmony_ci   >>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
2207db96d56Sopenharmony_ci   >>> title, year = res.fetchone()
2217db96d56Sopenharmony_ci   >>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')
2227db96d56Sopenharmony_ci   The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ciYou've now created an SQLite database using the :mod:`!sqlite3` module,
2257db96d56Sopenharmony_ciinserted data and retrieved values from it in multiple ways.
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci.. _SQL injection attacks: https://en.wikipedia.org/wiki/SQL_injection
2287db96d56Sopenharmony_ci.. _The Schema Table: https://www.sqlite.org/schematab.html
2297db96d56Sopenharmony_ci.. _cursors: https://en.wikipedia.org/wiki/Cursor_(databases)
2307db96d56Sopenharmony_ci.. _flexible typing: https://www.sqlite.org/flextypegood.html
2317db96d56Sopenharmony_ci.. _sqlite_master: https://www.sqlite.org/schematab.html
2327db96d56Sopenharmony_ci.. _transactions: https://en.wikipedia.org/wiki/Database_transaction
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci.. seealso::
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   * :ref:`sqlite3-howtos` for further reading:
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci      * :ref:`sqlite3-placeholders`
2397db96d56Sopenharmony_ci      * :ref:`sqlite3-adapters`
2407db96d56Sopenharmony_ci      * :ref:`sqlite3-converters`
2417db96d56Sopenharmony_ci      * :ref:`sqlite3-connection-context-manager`
2427db96d56Sopenharmony_ci      * :ref:`sqlite3-howto-row-factory`
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci   * :ref:`sqlite3-explanation` for in-depth background on transaction control.
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci.. _sqlite3-reference:
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ciReference
2497db96d56Sopenharmony_ci---------
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci.. We keep the old sqlite3-module-contents ref to prevent breaking links.
2527db96d56Sopenharmony_ci.. _sqlite3-module-contents:
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci.. _sqlite3-module-functions:
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ciModule functions
2577db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci.. function:: connect(database, timeout=5.0, detect_types=0, \
2607db96d56Sopenharmony_ci                      isolation_level="DEFERRED", check_same_thread=True, \
2617db96d56Sopenharmony_ci                      factory=sqlite3.Connection, cached_statements=128, \
2627db96d56Sopenharmony_ci                      uri=False)
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci   Open a connection to an SQLite database.
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci   :param database:
2677db96d56Sopenharmony_ci       The path to the database file to be opened.
2687db96d56Sopenharmony_ci       Pass ``":memory:"`` to open a connection to a database that is
2697db96d56Sopenharmony_ci       in RAM instead of on disk.
2707db96d56Sopenharmony_ci   :type database: :term:`path-like object`
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci   :param float timeout:
2737db96d56Sopenharmony_ci       How many seconds the connection should wait before raising
2747db96d56Sopenharmony_ci       an :exc:`OperationalError` when a table is locked.
2757db96d56Sopenharmony_ci       If another connection opens a transaction to modify a table,
2767db96d56Sopenharmony_ci       that table will be locked until the transaction is committed.
2777db96d56Sopenharmony_ci       Default five seconds.
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci   :param int detect_types:
2807db96d56Sopenharmony_ci       Control whether and how data types not
2817db96d56Sopenharmony_ci       :ref:`natively supported by SQLite <sqlite3-types>`
2827db96d56Sopenharmony_ci       are looked up to be converted to Python types,
2837db96d56Sopenharmony_ci       using the converters registered with :func:`register_converter`.
2847db96d56Sopenharmony_ci       Set it to any combination (using ``|``, bitwise or) of
2857db96d56Sopenharmony_ci       :const:`PARSE_DECLTYPES` and :const:`PARSE_COLNAMES`
2867db96d56Sopenharmony_ci       to enable this.
2877db96d56Sopenharmony_ci       Column names takes precedence over declared types if both flags are set.
2887db96d56Sopenharmony_ci       Types cannot be detected for generated fields (for example ``max(data)``),
2897db96d56Sopenharmony_ci       even when the *detect_types* parameter is set; :class:`str` will be
2907db96d56Sopenharmony_ci       returned instead.
2917db96d56Sopenharmony_ci       By default (``0``), type detection is disabled.
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci   :param isolation_level:
2947db96d56Sopenharmony_ci       The :attr:`~Connection.isolation_level` of the connection,
2957db96d56Sopenharmony_ci       controlling whether and how transactions are implicitly opened.
2967db96d56Sopenharmony_ci       Can be ``"DEFERRED"`` (default), ``"EXCLUSIVE"`` or ``"IMMEDIATE"``;
2977db96d56Sopenharmony_ci       or ``None`` to disable opening transactions implicitly.
2987db96d56Sopenharmony_ci       See :ref:`sqlite3-controlling-transactions` for more.
2997db96d56Sopenharmony_ci   :type isolation_level: str | None
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci   :param bool check_same_thread:
3027db96d56Sopenharmony_ci       If ``True`` (default), :exc:`ProgrammingError` will be raised
3037db96d56Sopenharmony_ci       if the database connection is used by a thread
3047db96d56Sopenharmony_ci       other than the one that created it.
3057db96d56Sopenharmony_ci       If ``False``, the connection may be accessed in multiple threads;
3067db96d56Sopenharmony_ci       write operations may need to be serialized by the user
3077db96d56Sopenharmony_ci       to avoid data corruption.
3087db96d56Sopenharmony_ci       See :attr:`threadsafety` for more information.
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci   :param ~sqlite3.Connection factory:
3117db96d56Sopenharmony_ci       A custom subclass of :class:`Connection` to create the connection with,
3127db96d56Sopenharmony_ci       if not the default :class:`Connection` class.
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci   :param int cached_statements:
3157db96d56Sopenharmony_ci       The number of statements that :mod:`!sqlite3`
3167db96d56Sopenharmony_ci       should internally cache for this connection, to avoid parsing overhead.
3177db96d56Sopenharmony_ci       By default, 128 statements.
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci   :param bool uri:
3207db96d56Sopenharmony_ci       If set to ``True``, *database* is interpreted as a
3217db96d56Sopenharmony_ci       :abbr:`URI (Uniform Resource Identifier)` with a file path
3227db96d56Sopenharmony_ci       and an optional query string.
3237db96d56Sopenharmony_ci       The scheme part *must* be ``"file:"``,
3247db96d56Sopenharmony_ci       and the path can be relative or absolute.
3257db96d56Sopenharmony_ci       The query string allows passing parameters to SQLite,
3267db96d56Sopenharmony_ci       enabling various :ref:`sqlite3-uri-tricks`.
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci   :rtype: ~sqlite3.Connection
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci   .. audit-event:: sqlite3.connect database sqlite3.connect
3317db96d56Sopenharmony_ci   .. audit-event:: sqlite3.connect/handle connection_handle sqlite3.connect
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci   .. versionadded:: 3.4
3347db96d56Sopenharmony_ci      The *uri* parameter.
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci   .. versionchanged:: 3.7
3377db96d56Sopenharmony_ci      *database* can now also be a :term:`path-like object`, not only a string.
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci   .. versionadded:: 3.10
3407db96d56Sopenharmony_ci      The ``sqlite3.connect/handle`` auditing event.
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci.. function:: complete_statement(statement)
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci   Return ``True`` if the string *statement* appears to contain
3457db96d56Sopenharmony_ci   one or more complete SQL statements.
3467db96d56Sopenharmony_ci   No syntactic verification or parsing of any kind is performed,
3477db96d56Sopenharmony_ci   other than checking that there are no unclosed string literals
3487db96d56Sopenharmony_ci   and the statement is terminated by a semicolon.
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci   For example:
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci   .. doctest::
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci      >>> sqlite3.complete_statement("SELECT foo FROM bar;")
3557db96d56Sopenharmony_ci      True
3567db96d56Sopenharmony_ci      >>> sqlite3.complete_statement("SELECT foo")
3577db96d56Sopenharmony_ci      False
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci   This function may be useful during command-line input
3607db96d56Sopenharmony_ci   to determine if the entered text seems to form a complete SQL statement,
3617db96d56Sopenharmony_ci   or if additional input is needed before calling :meth:`~Cursor.execute`.
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci.. function:: enable_callback_tracebacks(flag, /)
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci   Enable or disable callback tracebacks.
3667db96d56Sopenharmony_ci   By default you will not get any tracebacks in user-defined functions,
3677db96d56Sopenharmony_ci   aggregates, converters, authorizer callbacks etc. If you want to debug them,
3687db96d56Sopenharmony_ci   you can call this function with *flag* set to ``True``. Afterwards, you
3697db96d56Sopenharmony_ci   will get tracebacks from callbacks on :data:`sys.stderr`. Use ``False``
3707db96d56Sopenharmony_ci   to disable the feature again.
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci   Register an :func:`unraisable hook handler <sys.unraisablehook>` for an
3737db96d56Sopenharmony_ci   improved debug experience:
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci   .. testsetup:: sqlite3.trace
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci      import sqlite3
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci   .. doctest:: sqlite3.trace
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci      >>> sqlite3.enable_callback_tracebacks(True)
3827db96d56Sopenharmony_ci      >>> con = sqlite3.connect(":memory:")
3837db96d56Sopenharmony_ci      >>> def evil_trace(stmt):
3847db96d56Sopenharmony_ci      ...     5/0
3857db96d56Sopenharmony_ci      >>> con.set_trace_callback(evil_trace)
3867db96d56Sopenharmony_ci      >>> def debug(unraisable):
3877db96d56Sopenharmony_ci      ...     print(f"{unraisable.exc_value!r} in callback {unraisable.object.__name__}")
3887db96d56Sopenharmony_ci      ...     print(f"Error message: {unraisable.err_msg}")
3897db96d56Sopenharmony_ci      >>> import sys
3907db96d56Sopenharmony_ci      >>> sys.unraisablehook = debug
3917db96d56Sopenharmony_ci      >>> cur = con.execute("SELECT 1")
3927db96d56Sopenharmony_ci      ZeroDivisionError('division by zero') in callback evil_trace
3937db96d56Sopenharmony_ci      Error message: None
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ci.. function:: register_adapter(type, adapter, /)
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci   Register an *adapter* callable to adapt the Python type *type* into an
3987db96d56Sopenharmony_ci   SQLite type.
3997db96d56Sopenharmony_ci   The adapter is called with a Python object of type *type* as its sole
4007db96d56Sopenharmony_ci   argument, and must return a value of a
4017db96d56Sopenharmony_ci   :ref:`type that SQLite natively understands <sqlite3-types>`.
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci.. function:: register_converter(typename, converter, /)
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci   Register the *converter* callable to convert SQLite objects of type
4067db96d56Sopenharmony_ci   *typename* into a Python object of a specific type.
4077db96d56Sopenharmony_ci   The converter is invoked for all SQLite values of type *typename*;
4087db96d56Sopenharmony_ci   it is passed a :class:`bytes` object and should return an object of the
4097db96d56Sopenharmony_ci   desired Python type.
4107db96d56Sopenharmony_ci   Consult the parameter *detect_types* of
4117db96d56Sopenharmony_ci   :func:`connect` for information regarding how type detection works.
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci   Note: *typename* and the name of the type in your query are matched
4147db96d56Sopenharmony_ci   case-insensitively.
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci.. _sqlite3-module-constants:
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ciModule constants
4207db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci.. data:: PARSE_COLNAMES
4237db96d56Sopenharmony_ci
4247db96d56Sopenharmony_ci   Pass this flag value to the *detect_types* parameter of
4257db96d56Sopenharmony_ci   :func:`connect` to look up a converter function by
4267db96d56Sopenharmony_ci   using the type name, parsed from the query column name,
4277db96d56Sopenharmony_ci   as the converter dictionary key.
4287db96d56Sopenharmony_ci   The type name must be wrapped in square brackets (``[]``).
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci   .. code-block:: sql
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci      SELECT p as "p [point]" FROM test;  ! will look up converter "point"
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci   This flag may be combined with :const:`PARSE_DECLTYPES` using the ``|``
4357db96d56Sopenharmony_ci   (bitwise or) operator.
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci.. data:: PARSE_DECLTYPES
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci   Pass this flag value to the *detect_types* parameter of
4407db96d56Sopenharmony_ci   :func:`connect` to look up a converter function using
4417db96d56Sopenharmony_ci   the declared types for each column.
4427db96d56Sopenharmony_ci   The types are declared when the database table is created.
4437db96d56Sopenharmony_ci   :mod:`!sqlite3` will look up a converter function using the first word of the
4447db96d56Sopenharmony_ci   declared type as the converter dictionary key.
4457db96d56Sopenharmony_ci   For example:
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ci   .. code-block:: sql
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci      CREATE TABLE test(
4507db96d56Sopenharmony_ci         i integer primary key,  ! will look up a converter named "integer"
4517db96d56Sopenharmony_ci         p point,                ! will look up a converter named "point"
4527db96d56Sopenharmony_ci         n number(10)            ! will look up a converter named "number"
4537db96d56Sopenharmony_ci       )
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci   This flag may be combined with :const:`PARSE_COLNAMES` using the ``|``
4567db96d56Sopenharmony_ci   (bitwise or) operator.
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ci.. data:: SQLITE_OK
4597db96d56Sopenharmony_ci          SQLITE_DENY
4607db96d56Sopenharmony_ci          SQLITE_IGNORE
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci   Flags that should be returned by the *authorizer_callback* callable
4637db96d56Sopenharmony_ci   passed to :meth:`Connection.set_authorizer`, to indicate whether:
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci   * Access is allowed (:const:`!SQLITE_OK`),
4667db96d56Sopenharmony_ci   * The SQL statement should be aborted with an error (:const:`!SQLITE_DENY`)
4677db96d56Sopenharmony_ci   * The column should be treated as a ``NULL`` value (:const:`!SQLITE_IGNORE`)
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci.. data:: apilevel
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci   String constant stating the supported DB-API level. Required by the DB-API.
4727db96d56Sopenharmony_ci   Hard-coded to ``"2.0"``.
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci.. data:: paramstyle
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci   String constant stating the type of parameter marker formatting expected by
4777db96d56Sopenharmony_ci   the :mod:`!sqlite3` module. Required by the DB-API. Hard-coded to
4787db96d56Sopenharmony_ci   ``"qmark"``.
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci   .. note::
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci      The ``named`` DB-API parameter style is also supported.
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci.. data:: sqlite_version
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci   Version number of the runtime SQLite library as a :class:`string <str>`.
4877db96d56Sopenharmony_ci
4887db96d56Sopenharmony_ci.. data:: sqlite_version_info
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci   Version number of the runtime SQLite library as a :class:`tuple` of
4917db96d56Sopenharmony_ci   :class:`integers <int>`.
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci.. data:: threadsafety
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci   Integer constant required by the DB-API 2.0, stating the level of thread
4967db96d56Sopenharmony_ci   safety the :mod:`!sqlite3` module supports. This attribute is set based on
4977db96d56Sopenharmony_ci   the default `threading mode <https://sqlite.org/threadsafe.html>`_ the
4987db96d56Sopenharmony_ci   underlying SQLite library is compiled with. The SQLite threading modes are:
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci     1. **Single-thread**: In this mode, all mutexes are disabled and SQLite is
5017db96d56Sopenharmony_ci        unsafe to use in more than a single thread at once.
5027db96d56Sopenharmony_ci     2. **Multi-thread**: In this mode, SQLite can be safely used by multiple
5037db96d56Sopenharmony_ci        threads provided that no single database connection is used
5047db96d56Sopenharmony_ci        simultaneously in two or more threads.
5057db96d56Sopenharmony_ci     3. **Serialized**: In serialized mode, SQLite can be safely used by
5067db96d56Sopenharmony_ci        multiple threads with no restriction.
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci   The mappings from SQLite threading modes to DB-API 2.0 threadsafety levels
5097db96d56Sopenharmony_ci   are as follows:
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci   +------------------+-----------------+----------------------+-------------------------------+
5127db96d56Sopenharmony_ci   | SQLite threading | `threadsafety`_ | `SQLITE_THREADSAFE`_ | DB-API 2.0 meaning            |
5137db96d56Sopenharmony_ci   | mode             |                 |                      |                               |
5147db96d56Sopenharmony_ci   +==================+=================+======================+===============================+
5157db96d56Sopenharmony_ci   | single-thread    | 0               | 0                    | Threads may not share the     |
5167db96d56Sopenharmony_ci   |                  |                 |                      | module                        |
5177db96d56Sopenharmony_ci   +------------------+-----------------+----------------------+-------------------------------+
5187db96d56Sopenharmony_ci   | multi-thread     | 1               | 2                    | Threads may share the module, |
5197db96d56Sopenharmony_ci   |                  |                 |                      | but not connections           |
5207db96d56Sopenharmony_ci   +------------------+-----------------+----------------------+-------------------------------+
5217db96d56Sopenharmony_ci   | serialized       | 3               | 1                    | Threads may share the module, |
5227db96d56Sopenharmony_ci   |                  |                 |                      | connections and cursors       |
5237db96d56Sopenharmony_ci   +------------------+-----------------+----------------------+-------------------------------+
5247db96d56Sopenharmony_ci
5257db96d56Sopenharmony_ci   .. _threadsafety: https://peps.python.org/pep-0249/#threadsafety
5267db96d56Sopenharmony_ci   .. _SQLITE_THREADSAFE: https://sqlite.org/compile.html#threadsafe
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci   .. versionchanged:: 3.11
5297db96d56Sopenharmony_ci      Set *threadsafety* dynamically instead of hard-coding it to ``1``.
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci.. data:: version
5327db96d56Sopenharmony_ci
5337db96d56Sopenharmony_ci   Version number of this module as a :class:`string <str>`.
5347db96d56Sopenharmony_ci   This is not the version of the SQLite library.
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci.. data:: version_info
5377db96d56Sopenharmony_ci
5387db96d56Sopenharmony_ci   Version number of this module as a :class:`tuple` of :class:`integers <int>`.
5397db96d56Sopenharmony_ci   This is not the version of the SQLite library.
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci.. _sqlite3-connection-objects:
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ciConnection objects
5457db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci.. class:: Connection
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_ci   Each open SQLite database is represented by a ``Connection`` object,
5507db96d56Sopenharmony_ci   which is created using :func:`sqlite3.connect`.
5517db96d56Sopenharmony_ci   Their main purpose is creating :class:`Cursor` objects,
5527db96d56Sopenharmony_ci   and :ref:`sqlite3-controlling-transactions`.
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ci   .. seealso::
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_ci      * :ref:`sqlite3-connection-shortcuts`
5577db96d56Sopenharmony_ci      * :ref:`sqlite3-connection-context-manager`
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci   An SQLite database connection has the following attributes and methods:
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci   .. method:: cursor(factory=Cursor)
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci      Create and return a :class:`Cursor` object.
5647db96d56Sopenharmony_ci      The cursor method accepts a single optional parameter *factory*. If
5657db96d56Sopenharmony_ci      supplied, this must be a callable returning an instance of :class:`Cursor`
5667db96d56Sopenharmony_ci      or its subclasses.
5677db96d56Sopenharmony_ci
5687db96d56Sopenharmony_ci   .. method:: blobopen(table, column, row, /, *, readonly=False, name="main")
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci      Open a :class:`Blob` handle to an existing
5717db96d56Sopenharmony_ci      :abbr:`BLOB (Binary Large OBject)`.
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci      :param str table:
5747db96d56Sopenharmony_ci          The name of the table where the blob is located.
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci      :param str column:
5777db96d56Sopenharmony_ci          The name of the column where the blob is located.
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci      :param str row:
5807db96d56Sopenharmony_ci          The name of the row where the blob is located.
5817db96d56Sopenharmony_ci
5827db96d56Sopenharmony_ci      :param bool readonly:
5837db96d56Sopenharmony_ci          Set to ``True`` if the blob should be opened without write
5847db96d56Sopenharmony_ci          permissions.
5857db96d56Sopenharmony_ci          Defaults to ``False``.
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci      :param str name:
5887db96d56Sopenharmony_ci          The name of the database where the blob is located.
5897db96d56Sopenharmony_ci          Defaults to ``"main"``.
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ci      :raises OperationalError:
5927db96d56Sopenharmony_ci          When trying to open a blob in a ``WITHOUT ROWID`` table.
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci      :rtype: Blob
5957db96d56Sopenharmony_ci
5967db96d56Sopenharmony_ci      .. note::
5977db96d56Sopenharmony_ci
5987db96d56Sopenharmony_ci         The blob size cannot be changed using the :class:`Blob` class.
5997db96d56Sopenharmony_ci         Use the SQL function ``zeroblob`` to create a blob with a fixed size.
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ci      .. versionadded:: 3.11
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci   .. method:: commit()
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci      Commit any pending transaction to the database.
6067db96d56Sopenharmony_ci      If there is no open transaction, this method is a no-op.
6077db96d56Sopenharmony_ci
6087db96d56Sopenharmony_ci   .. method:: rollback()
6097db96d56Sopenharmony_ci
6107db96d56Sopenharmony_ci      Roll back to the start of any pending transaction.
6117db96d56Sopenharmony_ci      If there is no open transaction, this method is a no-op.
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci   .. method:: close()
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ci      Close the database connection.
6167db96d56Sopenharmony_ci      Any pending transaction is not committed implicitly;
6177db96d56Sopenharmony_ci      make sure to :meth:`commit` before closing
6187db96d56Sopenharmony_ci      to avoid losing pending changes.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci   .. method:: execute(sql, parameters=(), /)
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ci      Create a new :class:`Cursor` object and call
6237db96d56Sopenharmony_ci      :meth:`~Cursor.execute` on it with the given *sql* and *parameters*.
6247db96d56Sopenharmony_ci      Return the new cursor object.
6257db96d56Sopenharmony_ci
6267db96d56Sopenharmony_ci   .. method:: executemany(sql, parameters, /)
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ci      Create a new :class:`Cursor` object and call
6297db96d56Sopenharmony_ci      :meth:`~Cursor.executemany` on it with the given *sql* and *parameters*.
6307db96d56Sopenharmony_ci      Return the new cursor object.
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci   .. method:: executescript(sql_script, /)
6337db96d56Sopenharmony_ci
6347db96d56Sopenharmony_ci      Create a new :class:`Cursor` object and call
6357db96d56Sopenharmony_ci      :meth:`~Cursor.executescript` on it with the given *sql_script*.
6367db96d56Sopenharmony_ci      Return the new cursor object.
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci   .. method:: create_function(name, narg, func, *, deterministic=False)
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci      Create or remove a user-defined SQL function.
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci      :param str name:
6437db96d56Sopenharmony_ci          The name of the SQL function.
6447db96d56Sopenharmony_ci
6457db96d56Sopenharmony_ci      :param int narg:
6467db96d56Sopenharmony_ci          The number of arguments the SQL function can accept.
6477db96d56Sopenharmony_ci          If ``-1``, it may take any number of arguments.
6487db96d56Sopenharmony_ci
6497db96d56Sopenharmony_ci      :param func:
6507db96d56Sopenharmony_ci          A callable that is called when the SQL function is invoked.
6517db96d56Sopenharmony_ci          The callable must return :ref:`a type natively supported by SQLite
6527db96d56Sopenharmony_ci          <sqlite3-types>`.
6537db96d56Sopenharmony_ci          Set to ``None`` to remove an existing SQL function.
6547db96d56Sopenharmony_ci      :type func: :term:`callback` | None
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci      :param bool deterministic:
6577db96d56Sopenharmony_ci          If ``True``, the created SQL function is marked as
6587db96d56Sopenharmony_ci          `deterministic <https://sqlite.org/deterministic.html>`_,
6597db96d56Sopenharmony_ci          which allows SQLite to perform additional optimizations.
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci      :raises NotSupportedError:
6627db96d56Sopenharmony_ci          If *deterministic* is used with SQLite versions older than 3.8.3.
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci      .. versionadded:: 3.8
6657db96d56Sopenharmony_ci         The *deterministic* parameter.
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci      Example:
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci      .. doctest::
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ci         >>> import hashlib
6727db96d56Sopenharmony_ci         >>> def md5sum(t):
6737db96d56Sopenharmony_ci         ...     return hashlib.md5(t).hexdigest()
6747db96d56Sopenharmony_ci         >>> con = sqlite3.connect(":memory:")
6757db96d56Sopenharmony_ci         >>> con.create_function("md5", 1, md5sum)
6767db96d56Sopenharmony_ci         >>> for row in con.execute("SELECT md5(?)", (b"foo",)):
6777db96d56Sopenharmony_ci         ...     print(row)
6787db96d56Sopenharmony_ci         ('acbd18db4cc2f85cedef654fccc4a4d8',)
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ci   .. method:: create_aggregate(name, /, n_arg, aggregate_class)
6827db96d56Sopenharmony_ci
6837db96d56Sopenharmony_ci      Create or remove a user-defined SQL aggregate function.
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci      :param str name:
6867db96d56Sopenharmony_ci          The name of the SQL aggregate function.
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci      :param int n_arg:
6897db96d56Sopenharmony_ci          The number of arguments the SQL aggregate function can accept.
6907db96d56Sopenharmony_ci          If ``-1``, it may take any number of arguments.
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci      :param aggregate_class:
6937db96d56Sopenharmony_ci          A class must implement the following methods:
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci          * ``step()``: Add a row to the aggregate.
6967db96d56Sopenharmony_ci          * ``finalize()``: Return the final result of the aggregate as
6977db96d56Sopenharmony_ci            :ref:`a type natively supported by SQLite <sqlite3-types>`.
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci          The number of arguments that the ``step()`` method must accept
7007db96d56Sopenharmony_ci          is controlled by *n_arg*.
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ci          Set to ``None`` to remove an existing SQL aggregate function.
7037db96d56Sopenharmony_ci      :type aggregate_class: :term:`class` | None
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci      Example:
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci      .. testcode::
7087db96d56Sopenharmony_ci
7097db96d56Sopenharmony_ci         class MySum:
7107db96d56Sopenharmony_ci             def __init__(self):
7117db96d56Sopenharmony_ci                 self.count = 0
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci             def step(self, value):
7147db96d56Sopenharmony_ci                 self.count += value
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci             def finalize(self):
7177db96d56Sopenharmony_ci                 return self.count
7187db96d56Sopenharmony_ci
7197db96d56Sopenharmony_ci         con = sqlite3.connect(":memory:")
7207db96d56Sopenharmony_ci         con.create_aggregate("mysum", 1, MySum)
7217db96d56Sopenharmony_ci         cur = con.execute("CREATE TABLE test(i)")
7227db96d56Sopenharmony_ci         cur.execute("INSERT INTO test(i) VALUES(1)")
7237db96d56Sopenharmony_ci         cur.execute("INSERT INTO test(i) VALUES(2)")
7247db96d56Sopenharmony_ci         cur.execute("SELECT mysum(i) FROM test")
7257db96d56Sopenharmony_ci         print(cur.fetchone()[0])
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci         con.close()
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci      .. testoutput::
7307db96d56Sopenharmony_ci         :hide:
7317db96d56Sopenharmony_ci
7327db96d56Sopenharmony_ci         3
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci   .. method:: create_window_function(name, num_params, aggregate_class, /)
7367db96d56Sopenharmony_ci
7377db96d56Sopenharmony_ci      Create or remove a user-defined aggregate window function.
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ci      :param str name:
7407db96d56Sopenharmony_ci          The name of the SQL aggregate window function to create or remove.
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ci      :param int num_params:
7437db96d56Sopenharmony_ci          The number of arguments the SQL aggregate window function can accept.
7447db96d56Sopenharmony_ci          If ``-1``, it may take any number of arguments.
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci      :param aggregate_class:
7477db96d56Sopenharmony_ci          A class that must implement the following methods:
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci          * ``step()``: Add a row to the current window.
7507db96d56Sopenharmony_ci          * ``value()``: Return the current value of the aggregate.
7517db96d56Sopenharmony_ci          * ``inverse()``: Remove a row from the current window.
7527db96d56Sopenharmony_ci          * ``finalize()``: Return the final result of the aggregate as
7537db96d56Sopenharmony_ci            :ref:`a type natively supported by SQLite <sqlite3-types>`.
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci          The number of arguments that the ``step()`` and ``value()`` methods
7567db96d56Sopenharmony_ci          must accept is controlled by *num_params*.
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci          Set to ``None`` to remove an existing SQL aggregate window function.
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci      :raises NotSupportedError:
7617db96d56Sopenharmony_ci          If used with a version of SQLite older than 3.25.0,
7627db96d56Sopenharmony_ci          which does not support aggregate window functions.
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_ci      :type aggregate_class: :term:`class` | None
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci      .. versionadded:: 3.11
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ci      Example:
7697db96d56Sopenharmony_ci
7707db96d56Sopenharmony_ci      .. testcode::
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ci         # Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc
7737db96d56Sopenharmony_ci         class WindowSumInt:
7747db96d56Sopenharmony_ci             def __init__(self):
7757db96d56Sopenharmony_ci                 self.count = 0
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci             def step(self, value):
7787db96d56Sopenharmony_ci                 """Add a row to the current window."""
7797db96d56Sopenharmony_ci                 self.count += value
7807db96d56Sopenharmony_ci
7817db96d56Sopenharmony_ci             def value(self):
7827db96d56Sopenharmony_ci                 """Return the current value of the aggregate."""
7837db96d56Sopenharmony_ci                 return self.count
7847db96d56Sopenharmony_ci
7857db96d56Sopenharmony_ci             def inverse(self, value):
7867db96d56Sopenharmony_ci                 """Remove a row from the current window."""
7877db96d56Sopenharmony_ci                 self.count -= value
7887db96d56Sopenharmony_ci
7897db96d56Sopenharmony_ci             def finalize(self):
7907db96d56Sopenharmony_ci                 """Return the final value of the aggregate.
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci                 Any clean-up actions should be placed here.
7937db96d56Sopenharmony_ci                 """
7947db96d56Sopenharmony_ci                 return self.count
7957db96d56Sopenharmony_ci
7967db96d56Sopenharmony_ci
7977db96d56Sopenharmony_ci         con = sqlite3.connect(":memory:")
7987db96d56Sopenharmony_ci         cur = con.execute("CREATE TABLE test(x, y)")
7997db96d56Sopenharmony_ci         values = [
8007db96d56Sopenharmony_ci             ("a", 4),
8017db96d56Sopenharmony_ci             ("b", 5),
8027db96d56Sopenharmony_ci             ("c", 3),
8037db96d56Sopenharmony_ci             ("d", 8),
8047db96d56Sopenharmony_ci             ("e", 1),
8057db96d56Sopenharmony_ci         ]
8067db96d56Sopenharmony_ci         cur.executemany("INSERT INTO test VALUES(?, ?)", values)
8077db96d56Sopenharmony_ci         con.create_window_function("sumint", 1, WindowSumInt)
8087db96d56Sopenharmony_ci         cur.execute("""
8097db96d56Sopenharmony_ci             SELECT x, sumint(y) OVER (
8107db96d56Sopenharmony_ci                 ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
8117db96d56Sopenharmony_ci             ) AS sum_y
8127db96d56Sopenharmony_ci             FROM test ORDER BY x
8137db96d56Sopenharmony_ci         """)
8147db96d56Sopenharmony_ci         print(cur.fetchall())
8157db96d56Sopenharmony_ci
8167db96d56Sopenharmony_ci      .. testoutput::
8177db96d56Sopenharmony_ci         :hide:
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci         [('a', 9), ('b', 12), ('c', 16), ('d', 12), ('e', 9)]
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ci   .. method:: create_collation(name, callable)
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci      Create a collation named *name* using the collating function *callable*.
8247db96d56Sopenharmony_ci      *callable* is passed two :class:`string <str>` arguments,
8257db96d56Sopenharmony_ci      and it should return an :class:`integer <int>`:
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci      * ``1`` if the first is ordered higher than the second
8287db96d56Sopenharmony_ci      * ``-1`` if the first is ordered lower than the second
8297db96d56Sopenharmony_ci      * ``0`` if they are ordered equal
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci      The following example shows a reverse sorting collation:
8327db96d56Sopenharmony_ci
8337db96d56Sopenharmony_ci      .. testcode::
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci         def collate_reverse(string1, string2):
8367db96d56Sopenharmony_ci             if string1 == string2:
8377db96d56Sopenharmony_ci                 return 0
8387db96d56Sopenharmony_ci             elif string1 < string2:
8397db96d56Sopenharmony_ci                 return 1
8407db96d56Sopenharmony_ci             else:
8417db96d56Sopenharmony_ci                 return -1
8427db96d56Sopenharmony_ci
8437db96d56Sopenharmony_ci         con = sqlite3.connect(":memory:")
8447db96d56Sopenharmony_ci         con.create_collation("reverse", collate_reverse)
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci         cur = con.execute("CREATE TABLE test(x)")
8477db96d56Sopenharmony_ci         cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)])
8487db96d56Sopenharmony_ci         cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse")
8497db96d56Sopenharmony_ci         for row in cur:
8507db96d56Sopenharmony_ci             print(row)
8517db96d56Sopenharmony_ci         con.close()
8527db96d56Sopenharmony_ci
8537db96d56Sopenharmony_ci      .. testoutput::
8547db96d56Sopenharmony_ci         :hide:
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci         ('b',)
8577db96d56Sopenharmony_ci         ('a',)
8587db96d56Sopenharmony_ci
8597db96d56Sopenharmony_ci      Remove a collation function by setting *callable* to ``None``.
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci      .. versionchanged:: 3.11
8627db96d56Sopenharmony_ci         The collation name can contain any Unicode character.  Earlier, only
8637db96d56Sopenharmony_ci         ASCII characters were allowed.
8647db96d56Sopenharmony_ci
8657db96d56Sopenharmony_ci
8667db96d56Sopenharmony_ci   .. method:: interrupt()
8677db96d56Sopenharmony_ci
8687db96d56Sopenharmony_ci      Call this method from a different thread to abort any queries that might
8697db96d56Sopenharmony_ci      be executing on the connection.
8707db96d56Sopenharmony_ci      Aborted queries will raise an :exc:`OperationalError`.
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_ci   .. method:: set_authorizer(authorizer_callback)
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ci      Register callable *authorizer_callback* to be invoked for each attempt to
8767db96d56Sopenharmony_ci      access a column of a table in the database. The callback should return
8777db96d56Sopenharmony_ci      one of :const:`SQLITE_OK`, :const:`SQLITE_DENY`, or :const:`SQLITE_IGNORE`
8787db96d56Sopenharmony_ci      to signal how access to the column should be handled
8797db96d56Sopenharmony_ci      by the underlying SQLite library.
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci      The first argument to the callback signifies what kind of operation is to be
8827db96d56Sopenharmony_ci      authorized. The second and third argument will be arguments or ``None``
8837db96d56Sopenharmony_ci      depending on the first argument. The 4th argument is the name of the database
8847db96d56Sopenharmony_ci      ("main", "temp", etc.) if applicable. The 5th argument is the name of the
8857db96d56Sopenharmony_ci      inner-most trigger or view that is responsible for the access attempt or
8867db96d56Sopenharmony_ci      ``None`` if this access attempt is directly from input SQL code.
8877db96d56Sopenharmony_ci
8887db96d56Sopenharmony_ci      Please consult the SQLite documentation about the possible values for the first
8897db96d56Sopenharmony_ci      argument and the meaning of the second and third argument depending on the first
8907db96d56Sopenharmony_ci      one. All necessary constants are available in the :mod:`!sqlite3` module.
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci      Passing ``None`` as *authorizer_callback* will disable the authorizer.
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci      .. versionchanged:: 3.11
8957db96d56Sopenharmony_ci         Added support for disabling the authorizer using ``None``.
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ci   .. method:: set_progress_handler(progress_handler, n)
8997db96d56Sopenharmony_ci
9007db96d56Sopenharmony_ci      Register callable *progress_handler* to be invoked for every *n*
9017db96d56Sopenharmony_ci      instructions of the SQLite virtual machine. This is useful if you want to
9027db96d56Sopenharmony_ci      get called from SQLite during long-running operations, for example to update
9037db96d56Sopenharmony_ci      a GUI.
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci      If you want to clear any previously installed progress handler, call the
9067db96d56Sopenharmony_ci      method with ``None`` for *progress_handler*.
9077db96d56Sopenharmony_ci
9087db96d56Sopenharmony_ci      Returning a non-zero value from the handler function will terminate the
9097db96d56Sopenharmony_ci      currently executing query and cause it to raise an :exc:`OperationalError`
9107db96d56Sopenharmony_ci      exception.
9117db96d56Sopenharmony_ci
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_ci   .. method:: set_trace_callback(trace_callback)
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ci      Register callable *trace_callback* to be invoked for each SQL statement
9167db96d56Sopenharmony_ci      that is actually executed by the SQLite backend.
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci      The only argument passed to the callback is the statement (as
9197db96d56Sopenharmony_ci      :class:`str`) that is being executed. The return value of the callback is
9207db96d56Sopenharmony_ci      ignored. Note that the backend does not only run statements passed to the
9217db96d56Sopenharmony_ci      :meth:`Cursor.execute` methods.  Other sources include the
9227db96d56Sopenharmony_ci      :ref:`transaction management <sqlite3-controlling-transactions>` of the
9237db96d56Sopenharmony_ci      :mod:`!sqlite3` module and the execution of triggers defined in the current
9247db96d56Sopenharmony_ci      database.
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ci      Passing ``None`` as *trace_callback* will disable the trace callback.
9277db96d56Sopenharmony_ci
9287db96d56Sopenharmony_ci      .. note::
9297db96d56Sopenharmony_ci         Exceptions raised in the trace callback are not propagated. As a
9307db96d56Sopenharmony_ci         development and debugging aid, use
9317db96d56Sopenharmony_ci         :meth:`~sqlite3.enable_callback_tracebacks` to enable printing
9327db96d56Sopenharmony_ci         tracebacks from exceptions raised in the trace callback.
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci      .. versionadded:: 3.3
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci
9377db96d56Sopenharmony_ci   .. method:: enable_load_extension(enabled, /)
9387db96d56Sopenharmony_ci
9397db96d56Sopenharmony_ci      Enable the SQLite engine to load SQLite extensions from shared libraries
9407db96d56Sopenharmony_ci      if *enabled* is ``True``;
9417db96d56Sopenharmony_ci      else, disallow loading SQLite extensions.
9427db96d56Sopenharmony_ci      SQLite extensions can define new functions,
9437db96d56Sopenharmony_ci      aggregates or whole new virtual table implementations.  One well-known
9447db96d56Sopenharmony_ci      extension is the fulltext-search extension distributed with SQLite.
9457db96d56Sopenharmony_ci
9467db96d56Sopenharmony_ci      .. note::
9477db96d56Sopenharmony_ci
9487db96d56Sopenharmony_ci         The :mod:`!sqlite3` module is not built with loadable extension support by
9497db96d56Sopenharmony_ci         default, because some platforms (notably macOS) have SQLite
9507db96d56Sopenharmony_ci         libraries which are compiled without this feature.
9517db96d56Sopenharmony_ci         To get loadable extension support,
9527db96d56Sopenharmony_ci         you must pass the :option:`--enable-loadable-sqlite-extensions` option
9537db96d56Sopenharmony_ci         to :program:`configure`.
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ci      .. audit-event:: sqlite3.enable_load_extension connection,enabled sqlite3.Connection.enable_load_extension
9567db96d56Sopenharmony_ci
9577db96d56Sopenharmony_ci      .. versionadded:: 3.2
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci      .. versionchanged:: 3.10
9607db96d56Sopenharmony_ci         Added the ``sqlite3.enable_load_extension`` auditing event.
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ci      .. testsetup:: sqlite3.loadext
9637db96d56Sopenharmony_ci
9647db96d56Sopenharmony_ci         import sqlite3
9657db96d56Sopenharmony_ci         con = sqlite3.connect(":memory:")
9667db96d56Sopenharmony_ci
9677db96d56Sopenharmony_ci      .. testcode:: sqlite3.loadext
9687db96d56Sopenharmony_ci         :skipif: True  # not testable at the moment
9697db96d56Sopenharmony_ci
9707db96d56Sopenharmony_ci         con.enable_load_extension(True)
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ci         # Load the fulltext search extension
9737db96d56Sopenharmony_ci         con.execute("select load_extension('./fts3.so')")
9747db96d56Sopenharmony_ci
9757db96d56Sopenharmony_ci         # alternatively you can load the extension using an API call:
9767db96d56Sopenharmony_ci         # con.load_extension("./fts3.so")
9777db96d56Sopenharmony_ci
9787db96d56Sopenharmony_ci         # disable extension loading again
9797db96d56Sopenharmony_ci         con.enable_load_extension(False)
9807db96d56Sopenharmony_ci
9817db96d56Sopenharmony_ci         # example from SQLite wiki
9827db96d56Sopenharmony_ci         con.execute("CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)")
9837db96d56Sopenharmony_ci         con.executescript("""
9847db96d56Sopenharmony_ci             INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes');
9857db96d56Sopenharmony_ci             INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery');
9867db96d56Sopenharmony_ci             INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour');
9877db96d56Sopenharmony_ci             INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter');
9887db96d56Sopenharmony_ci             """)
9897db96d56Sopenharmony_ci         for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"):
9907db96d56Sopenharmony_ci             print(row)
9917db96d56Sopenharmony_ci
9927db96d56Sopenharmony_ci         con.close()
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_ci      .. testoutput:: sqlite3.loadext
9957db96d56Sopenharmony_ci         :hide:
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci         (2, 'broccoli pie', 'broccoli cheese onions flour')
9987db96d56Sopenharmony_ci         (3, 'pumpkin pie', 'pumpkin sugar flour butter')
9997db96d56Sopenharmony_ci
10007db96d56Sopenharmony_ci   .. method:: load_extension(path, /)
10017db96d56Sopenharmony_ci
10027db96d56Sopenharmony_ci      Load an SQLite extension from a shared library located at *path*.
10037db96d56Sopenharmony_ci      Enable extension loading with :meth:`enable_load_extension` before
10047db96d56Sopenharmony_ci      calling this method.
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci      .. audit-event:: sqlite3.load_extension connection,path sqlite3.Connection.load_extension
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ci      .. versionadded:: 3.2
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_ci      .. versionchanged:: 3.10
10117db96d56Sopenharmony_ci         Added the ``sqlite3.load_extension`` auditing event.
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ci   .. method:: iterdump
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ci      Return an :term:`iterator` to dump the database as SQL source code.
10167db96d56Sopenharmony_ci      Useful when saving an in-memory database for later restoration.
10177db96d56Sopenharmony_ci      Similar to the ``.dump`` command in the :program:`sqlite3` shell.
10187db96d56Sopenharmony_ci
10197db96d56Sopenharmony_ci      Example:
10207db96d56Sopenharmony_ci
10217db96d56Sopenharmony_ci      .. testcode::
10227db96d56Sopenharmony_ci
10237db96d56Sopenharmony_ci         # Convert file example.db to SQL dump file dump.sql
10247db96d56Sopenharmony_ci         con = sqlite3.connect('example.db')
10257db96d56Sopenharmony_ci         with open('dump.sql', 'w') as f:
10267db96d56Sopenharmony_ci             for line in con.iterdump():
10277db96d56Sopenharmony_ci                 f.write('%s\n' % line)
10287db96d56Sopenharmony_ci         con.close()
10297db96d56Sopenharmony_ci
10307db96d56Sopenharmony_ci
10317db96d56Sopenharmony_ci   .. method:: backup(target, *, pages=-1, progress=None, name="main", sleep=0.250)
10327db96d56Sopenharmony_ci
10337db96d56Sopenharmony_ci      Create a backup of an SQLite database.
10347db96d56Sopenharmony_ci
10357db96d56Sopenharmony_ci      Works even if the database is being accessed by other clients
10367db96d56Sopenharmony_ci      or concurrently by the same connection.
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_ci      :param ~sqlite3.Connection target:
10397db96d56Sopenharmony_ci          The database connection to save the backup to.
10407db96d56Sopenharmony_ci
10417db96d56Sopenharmony_ci      :param int pages:
10427db96d56Sopenharmony_ci          The number of pages to copy at a time.
10437db96d56Sopenharmony_ci          If equal to or less than ``0``,
10447db96d56Sopenharmony_ci          the entire database is copied in a single step.
10457db96d56Sopenharmony_ci          Defaults to ``-1``.
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci      :param progress:
10487db96d56Sopenharmony_ci          If set to a callable, it is invoked with three integer arguments for
10497db96d56Sopenharmony_ci          every backup iteration:
10507db96d56Sopenharmony_ci          the *status* of the last iteration,
10517db96d56Sopenharmony_ci          the *remaining* number of pages still to be copied,
10527db96d56Sopenharmony_ci          and the *total* number of pages.
10537db96d56Sopenharmony_ci          Defaults to ``None``.
10547db96d56Sopenharmony_ci      :type progress: :term:`callback` | None
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci      :param str name:
10577db96d56Sopenharmony_ci          The name of the database to back up.
10587db96d56Sopenharmony_ci          Either ``"main"`` (the default) for the main database,
10597db96d56Sopenharmony_ci          ``"temp"`` for the temporary database,
10607db96d56Sopenharmony_ci          or the name of a custom database as attached using the
10617db96d56Sopenharmony_ci          ``ATTACH DATABASE`` SQL statement.
10627db96d56Sopenharmony_ci
10637db96d56Sopenharmony_ci      :param float sleep:
10647db96d56Sopenharmony_ci          The number of seconds to sleep between successive attempts
10657db96d56Sopenharmony_ci          to back up remaining pages.
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci      Example 1, copy an existing database into another:
10687db96d56Sopenharmony_ci
10697db96d56Sopenharmony_ci      .. testcode::
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci         def progress(status, remaining, total):
10727db96d56Sopenharmony_ci             print(f'Copied {total-remaining} of {total} pages...')
10737db96d56Sopenharmony_ci
10747db96d56Sopenharmony_ci         src = sqlite3.connect('example.db')
10757db96d56Sopenharmony_ci         dst = sqlite3.connect('backup.db')
10767db96d56Sopenharmony_ci         with dst:
10777db96d56Sopenharmony_ci             src.backup(dst, pages=1, progress=progress)
10787db96d56Sopenharmony_ci         dst.close()
10797db96d56Sopenharmony_ci         src.close()
10807db96d56Sopenharmony_ci
10817db96d56Sopenharmony_ci      .. testoutput::
10827db96d56Sopenharmony_ci         :hide:
10837db96d56Sopenharmony_ci
10847db96d56Sopenharmony_ci         Copied 0 of 0 pages...
10857db96d56Sopenharmony_ci
10867db96d56Sopenharmony_ci      Example 2, copy an existing database into a transient copy:
10877db96d56Sopenharmony_ci
10887db96d56Sopenharmony_ci      .. testcode::
10897db96d56Sopenharmony_ci
10907db96d56Sopenharmony_ci         src = sqlite3.connect('example.db')
10917db96d56Sopenharmony_ci         dst = sqlite3.connect(':memory:')
10927db96d56Sopenharmony_ci         src.backup(dst)
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci      .. versionadded:: 3.7
10957db96d56Sopenharmony_ci
10967db96d56Sopenharmony_ci   .. method:: getlimit(category, /)
10977db96d56Sopenharmony_ci
10987db96d56Sopenharmony_ci      Get a connection runtime limit.
10997db96d56Sopenharmony_ci
11007db96d56Sopenharmony_ci      :param int category:
11017db96d56Sopenharmony_ci         The `SQLite limit category`_ to be queried.
11027db96d56Sopenharmony_ci
11037db96d56Sopenharmony_ci      :rtype: int
11047db96d56Sopenharmony_ci
11057db96d56Sopenharmony_ci      :raises ProgrammingError:
11067db96d56Sopenharmony_ci         If *category* is not recognised by the underlying SQLite library.
11077db96d56Sopenharmony_ci
11087db96d56Sopenharmony_ci      Example, query the maximum length of an SQL statement
11097db96d56Sopenharmony_ci      for :class:`Connection` ``con`` (the default is 1000000000):
11107db96d56Sopenharmony_ci
11117db96d56Sopenharmony_ci      .. testsetup:: sqlite3.limits
11127db96d56Sopenharmony_ci
11137db96d56Sopenharmony_ci         import sqlite3
11147db96d56Sopenharmony_ci         con = sqlite3.connect(":memory:")
11157db96d56Sopenharmony_ci         con.setlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH, 1_000_000_000)
11167db96d56Sopenharmony_ci         con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 10)
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci      .. doctest:: sqlite3.limits
11197db96d56Sopenharmony_ci
11207db96d56Sopenharmony_ci         >>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH)
11217db96d56Sopenharmony_ci         1000000000
11227db96d56Sopenharmony_ci
11237db96d56Sopenharmony_ci      .. versionadded:: 3.11
11247db96d56Sopenharmony_ci
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ci   .. method:: setlimit(category, limit, /)
11277db96d56Sopenharmony_ci
11287db96d56Sopenharmony_ci      Set a connection runtime limit.
11297db96d56Sopenharmony_ci      Attempts to increase a limit above its hard upper bound are silently
11307db96d56Sopenharmony_ci      truncated to the hard upper bound. Regardless of whether or not the limit
11317db96d56Sopenharmony_ci      was changed, the prior value of the limit is returned.
11327db96d56Sopenharmony_ci
11337db96d56Sopenharmony_ci      :param int category:
11347db96d56Sopenharmony_ci         The `SQLite limit category`_ to be set.
11357db96d56Sopenharmony_ci
11367db96d56Sopenharmony_ci      :param int limit:
11377db96d56Sopenharmony_ci         The value of the new limit.
11387db96d56Sopenharmony_ci         If negative, the current limit is unchanged.
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci      :rtype: int
11417db96d56Sopenharmony_ci
11427db96d56Sopenharmony_ci      :raises ProgrammingError:
11437db96d56Sopenharmony_ci         If *category* is not recognised by the underlying SQLite library.
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci      Example, limit the number of attached databases to 1
11467db96d56Sopenharmony_ci      for :class:`Connection` ``con`` (the default limit is 10):
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ci      .. doctest:: sqlite3.limits
11497db96d56Sopenharmony_ci
11507db96d56Sopenharmony_ci         >>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1)
11517db96d56Sopenharmony_ci         10
11527db96d56Sopenharmony_ci         >>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED)
11537db96d56Sopenharmony_ci         1
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ci      .. versionadded:: 3.11
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ci   .. _SQLite limit category: https://www.sqlite.org/c3ref/c_limit_attached.html
11587db96d56Sopenharmony_ci
11597db96d56Sopenharmony_ci
11607db96d56Sopenharmony_ci   .. method:: serialize(*, name="main")
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ci      Serialize a database into a :class:`bytes` object.  For an
11637db96d56Sopenharmony_ci      ordinary on-disk database file, the serialization is just a copy of the
11647db96d56Sopenharmony_ci      disk file.  For an in-memory database or a "temp" database, the
11657db96d56Sopenharmony_ci      serialization is the same sequence of bytes which would be written to
11667db96d56Sopenharmony_ci      disk if that database were backed up to disk.
11677db96d56Sopenharmony_ci
11687db96d56Sopenharmony_ci      :param str name:
11697db96d56Sopenharmony_ci         The database name to be serialized.
11707db96d56Sopenharmony_ci         Defaults to ``"main"``.
11717db96d56Sopenharmony_ci
11727db96d56Sopenharmony_ci      :rtype: bytes
11737db96d56Sopenharmony_ci
11747db96d56Sopenharmony_ci      .. note::
11757db96d56Sopenharmony_ci
11767db96d56Sopenharmony_ci         This method is only available if the underlying SQLite library has the
11777db96d56Sopenharmony_ci         serialize API.
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ci      .. versionadded:: 3.11
11807db96d56Sopenharmony_ci
11817db96d56Sopenharmony_ci
11827db96d56Sopenharmony_ci   .. method:: deserialize(data, /, *, name="main")
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_ci      Deserialize a :meth:`serialized <serialize>` database into a
11857db96d56Sopenharmony_ci      :class:`Connection`.
11867db96d56Sopenharmony_ci      This method causes the database connection to disconnect from database
11877db96d56Sopenharmony_ci      *name*, and reopen *name* as an in-memory database based on the
11887db96d56Sopenharmony_ci      serialization contained in *data*.
11897db96d56Sopenharmony_ci
11907db96d56Sopenharmony_ci      :param bytes data:
11917db96d56Sopenharmony_ci         A serialized database.
11927db96d56Sopenharmony_ci
11937db96d56Sopenharmony_ci      :param str name:
11947db96d56Sopenharmony_ci         The database name to deserialize into.
11957db96d56Sopenharmony_ci         Defaults to ``"main"``.
11967db96d56Sopenharmony_ci
11977db96d56Sopenharmony_ci      :raises OperationalError:
11987db96d56Sopenharmony_ci         If the database connection is currently involved in a read
11997db96d56Sopenharmony_ci         transaction or a backup operation.
12007db96d56Sopenharmony_ci
12017db96d56Sopenharmony_ci      :raises DatabaseError:
12027db96d56Sopenharmony_ci         If *data* does not contain a valid SQLite database.
12037db96d56Sopenharmony_ci
12047db96d56Sopenharmony_ci      :raises OverflowError:
12057db96d56Sopenharmony_ci         If :func:`len(data) <len>` is larger than ``2**63 - 1``.
12067db96d56Sopenharmony_ci
12077db96d56Sopenharmony_ci      .. note::
12087db96d56Sopenharmony_ci
12097db96d56Sopenharmony_ci         This method is only available if the underlying SQLite library has the
12107db96d56Sopenharmony_ci         deserialize API.
12117db96d56Sopenharmony_ci
12127db96d56Sopenharmony_ci      .. versionadded:: 3.11
12137db96d56Sopenharmony_ci
12147db96d56Sopenharmony_ci   .. attribute:: in_transaction
12157db96d56Sopenharmony_ci
12167db96d56Sopenharmony_ci      This read-only attribute corresponds to the low-level SQLite
12177db96d56Sopenharmony_ci      `autocommit mode`_.
12187db96d56Sopenharmony_ci
12197db96d56Sopenharmony_ci      ``True`` if a transaction is active (there are uncommitted changes),
12207db96d56Sopenharmony_ci      ``False`` otherwise.
12217db96d56Sopenharmony_ci
12227db96d56Sopenharmony_ci      .. versionadded:: 3.2
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_ci   .. attribute:: isolation_level
12257db96d56Sopenharmony_ci
12267db96d56Sopenharmony_ci      This attribute controls the :ref:`transaction handling
12277db96d56Sopenharmony_ci      <sqlite3-controlling-transactions>` performed by :mod:`!sqlite3`.
12287db96d56Sopenharmony_ci      If set to ``None``, transactions are never implicitly opened.
12297db96d56Sopenharmony_ci      If set to one of ``"DEFERRED"``, ``"IMMEDIATE"``, or ``"EXCLUSIVE"``,
12307db96d56Sopenharmony_ci      corresponding to the underlying `SQLite transaction behaviour`_,
12317db96d56Sopenharmony_ci      implicit :ref:`transaction management
12327db96d56Sopenharmony_ci      <sqlite3-controlling-transactions>` is performed.
12337db96d56Sopenharmony_ci
12347db96d56Sopenharmony_ci      If not overridden by the *isolation_level* parameter of :func:`connect`,
12357db96d56Sopenharmony_ci      the default is ``""``, which is an alias for ``"DEFERRED"``.
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ci   .. attribute:: row_factory
12387db96d56Sopenharmony_ci
12397db96d56Sopenharmony_ci      The initial :attr:`~Cursor.row_factory`
12407db96d56Sopenharmony_ci      for :class:`Cursor` objects created from this connection.
12417db96d56Sopenharmony_ci      Assigning to this attribute does not affect the :attr:`!row_factory`
12427db96d56Sopenharmony_ci      of existing cursors belonging to this connection, only new ones.
12437db96d56Sopenharmony_ci      Is ``None`` by default,
12447db96d56Sopenharmony_ci      meaning each row is returned as a :class:`tuple`.
12457db96d56Sopenharmony_ci
12467db96d56Sopenharmony_ci      See :ref:`sqlite3-howto-row-factory` for more details.
12477db96d56Sopenharmony_ci
12487db96d56Sopenharmony_ci   .. attribute:: text_factory
12497db96d56Sopenharmony_ci
12507db96d56Sopenharmony_ci      A callable that accepts a :class:`bytes` parameter and returns a text
12517db96d56Sopenharmony_ci      representation of it.
12527db96d56Sopenharmony_ci      The callable is invoked for SQLite values with the ``TEXT`` data type.
12537db96d56Sopenharmony_ci      By default, this attribute is set to :class:`str`.
12547db96d56Sopenharmony_ci      If you want to return ``bytes`` instead, set *text_factory* to ``bytes``.
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci      Example:
12577db96d56Sopenharmony_ci
12587db96d56Sopenharmony_ci      .. testcode::
12597db96d56Sopenharmony_ci
12607db96d56Sopenharmony_ci         con = sqlite3.connect(":memory:")
12617db96d56Sopenharmony_ci         cur = con.cursor()
12627db96d56Sopenharmony_ci
12637db96d56Sopenharmony_ci         AUSTRIA = "Österreich"
12647db96d56Sopenharmony_ci
12657db96d56Sopenharmony_ci         # by default, rows are returned as str
12667db96d56Sopenharmony_ci         cur.execute("SELECT ?", (AUSTRIA,))
12677db96d56Sopenharmony_ci         row = cur.fetchone()
12687db96d56Sopenharmony_ci         assert row[0] == AUSTRIA
12697db96d56Sopenharmony_ci
12707db96d56Sopenharmony_ci         # but we can make sqlite3 always return bytestrings ...
12717db96d56Sopenharmony_ci         con.text_factory = bytes
12727db96d56Sopenharmony_ci         cur.execute("SELECT ?", (AUSTRIA,))
12737db96d56Sopenharmony_ci         row = cur.fetchone()
12747db96d56Sopenharmony_ci         assert type(row[0]) is bytes
12757db96d56Sopenharmony_ci         # the bytestrings will be encoded in UTF-8, unless you stored garbage in the
12767db96d56Sopenharmony_ci         # database ...
12777db96d56Sopenharmony_ci         assert row[0] == AUSTRIA.encode("utf-8")
12787db96d56Sopenharmony_ci
12797db96d56Sopenharmony_ci         # we can also implement a custom text_factory ...
12807db96d56Sopenharmony_ci         # here we implement one that appends "foo" to all strings
12817db96d56Sopenharmony_ci         con.text_factory = lambda x: x.decode("utf-8") + "foo"
12827db96d56Sopenharmony_ci         cur.execute("SELECT ?", ("bar",))
12837db96d56Sopenharmony_ci         row = cur.fetchone()
12847db96d56Sopenharmony_ci         assert row[0] == "barfoo"
12857db96d56Sopenharmony_ci
12867db96d56Sopenharmony_ci         con.close()
12877db96d56Sopenharmony_ci
12887db96d56Sopenharmony_ci   .. attribute:: total_changes
12897db96d56Sopenharmony_ci
12907db96d56Sopenharmony_ci      Return the total number of database rows that have been modified, inserted, or
12917db96d56Sopenharmony_ci      deleted since the database connection was opened.
12927db96d56Sopenharmony_ci
12937db96d56Sopenharmony_ci
12947db96d56Sopenharmony_ci.. _sqlite3-cursor-objects:
12957db96d56Sopenharmony_ci
12967db96d56Sopenharmony_ciCursor objects
12977db96d56Sopenharmony_ci^^^^^^^^^^^^^^
12987db96d56Sopenharmony_ci
12997db96d56Sopenharmony_ci   A ``Cursor`` object represents a `database cursor`_
13007db96d56Sopenharmony_ci   which is used to execute SQL statements,
13017db96d56Sopenharmony_ci   and manage the context of a fetch operation.
13027db96d56Sopenharmony_ci   Cursors are created using :meth:`Connection.cursor`,
13037db96d56Sopenharmony_ci   or by using any of the :ref:`connection shortcut methods
13047db96d56Sopenharmony_ci   <sqlite3-connection-shortcuts>`.
13057db96d56Sopenharmony_ci
13067db96d56Sopenharmony_ci   Cursor objects are :term:`iterators <iterator>`,
13077db96d56Sopenharmony_ci   meaning that if you :meth:`~Cursor.execute` a ``SELECT`` query,
13087db96d56Sopenharmony_ci   you can simply iterate over the cursor to fetch the resulting rows:
13097db96d56Sopenharmony_ci
13107db96d56Sopenharmony_ci   .. testsetup:: sqlite3.cursor
13117db96d56Sopenharmony_ci
13127db96d56Sopenharmony_ci      import sqlite3
13137db96d56Sopenharmony_ci      con = sqlite3.connect(":memory:", isolation_level=None)
13147db96d56Sopenharmony_ci      cur = con.execute("CREATE TABLE data(t)")
13157db96d56Sopenharmony_ci      cur.execute("INSERT INTO data VALUES(1)")
13167db96d56Sopenharmony_ci
13177db96d56Sopenharmony_ci   .. testcode:: sqlite3.cursor
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ci      for row in cur.execute("SELECT t FROM data"):
13207db96d56Sopenharmony_ci          print(row)
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci   .. testoutput:: sqlite3.cursor
13237db96d56Sopenharmony_ci      :hide:
13247db96d56Sopenharmony_ci
13257db96d56Sopenharmony_ci      (1,)
13267db96d56Sopenharmony_ci
13277db96d56Sopenharmony_ci   .. _database cursor: https://en.wikipedia.org/wiki/Cursor_(databases)
13287db96d56Sopenharmony_ci
13297db96d56Sopenharmony_ci.. class:: Cursor
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ci   A :class:`Cursor` instance has the following attributes and methods.
13327db96d56Sopenharmony_ci
13337db96d56Sopenharmony_ci   .. index:: single: ? (question mark); in SQL statements
13347db96d56Sopenharmony_ci   .. index:: single: : (colon); in SQL statements
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci   .. method:: execute(sql, parameters=(), /)
13377db96d56Sopenharmony_ci
13387db96d56Sopenharmony_ci      Execute SQL a single SQL statement,
13397db96d56Sopenharmony_ci      optionally binding Python values using
13407db96d56Sopenharmony_ci      :ref:`placeholders <sqlite3-placeholders>`.
13417db96d56Sopenharmony_ci
13427db96d56Sopenharmony_ci      :param str sql:
13437db96d56Sopenharmony_ci         A single SQL statement.
13447db96d56Sopenharmony_ci
13457db96d56Sopenharmony_ci      :param parameters:
13467db96d56Sopenharmony_ci         Python values to bind to placeholders in *sql*.
13477db96d56Sopenharmony_ci         A :class:`!dict` if named placeholders are used.
13487db96d56Sopenharmony_ci         A :term:`!sequence` if unnamed placeholders are used.
13497db96d56Sopenharmony_ci         See :ref:`sqlite3-placeholders`.
13507db96d56Sopenharmony_ci      :type parameters: :class:`dict` | :term:`sequence`
13517db96d56Sopenharmony_ci
13527db96d56Sopenharmony_ci      :raises ProgrammingError:
13537db96d56Sopenharmony_ci         If *sql* contains more than one SQL statement.
13547db96d56Sopenharmony_ci
13557db96d56Sopenharmony_ci      If :attr:`~Connection.isolation_level` is not ``None``,
13567db96d56Sopenharmony_ci      *sql* is an ``INSERT``, ``UPDATE``, ``DELETE``, or ``REPLACE`` statement,
13577db96d56Sopenharmony_ci      and there is no open transaction,
13587db96d56Sopenharmony_ci      a transaction is implicitly opened before executing *sql*.
13597db96d56Sopenharmony_ci
13607db96d56Sopenharmony_ci      Use :meth:`executescript` to execute multiple SQL statements.
13617db96d56Sopenharmony_ci
13627db96d56Sopenharmony_ci   .. method:: executemany(sql, parameters, /)
13637db96d56Sopenharmony_ci
13647db96d56Sopenharmony_ci      For every item in *parameters*,
13657db96d56Sopenharmony_ci      repeatedly execute the :ref:`parameterized <sqlite3-placeholders>`
13667db96d56Sopenharmony_ci      :abbr:`DML (Data Manipulation Language)` SQL statement *sql*.
13677db96d56Sopenharmony_ci
13687db96d56Sopenharmony_ci      Uses the same implicit transaction handling as :meth:`~Cursor.execute`.
13697db96d56Sopenharmony_ci
13707db96d56Sopenharmony_ci      :param str sql:
13717db96d56Sopenharmony_ci         A single SQL DML statement.
13727db96d56Sopenharmony_ci
13737db96d56Sopenharmony_ci      :param parameters:
13747db96d56Sopenharmony_ci         An :term:`!iterable` of parameters to bind with
13757db96d56Sopenharmony_ci         the placeholders in *sql*.
13767db96d56Sopenharmony_ci         See :ref:`sqlite3-placeholders`.
13777db96d56Sopenharmony_ci      :type parameters: :term:`iterable`
13787db96d56Sopenharmony_ci
13797db96d56Sopenharmony_ci      :raises ProgrammingError:
13807db96d56Sopenharmony_ci         If *sql* contains more than one SQL statement,
13817db96d56Sopenharmony_ci         or is not a DML statment.
13827db96d56Sopenharmony_ci
13837db96d56Sopenharmony_ci      Example:
13847db96d56Sopenharmony_ci
13857db96d56Sopenharmony_ci      .. testcode:: sqlite3.cursor
13867db96d56Sopenharmony_ci
13877db96d56Sopenharmony_ci         rows = [
13887db96d56Sopenharmony_ci             ("row1",),
13897db96d56Sopenharmony_ci             ("row2",),
13907db96d56Sopenharmony_ci         ]
13917db96d56Sopenharmony_ci         # cur is an sqlite3.Cursor object
13927db96d56Sopenharmony_ci         cur.executemany("INSERT INTO data VALUES(?)", rows)
13937db96d56Sopenharmony_ci
13947db96d56Sopenharmony_ci      .. note::
13957db96d56Sopenharmony_ci
13967db96d56Sopenharmony_ci         Any resulting rows are discarded,
13977db96d56Sopenharmony_ci         including DML statements with `RETURNING clauses`_.
13987db96d56Sopenharmony_ci
13997db96d56Sopenharmony_ci      .. _RETURNING clauses: https://www.sqlite.org/lang_returning.html
14007db96d56Sopenharmony_ci
14017db96d56Sopenharmony_ci   .. method:: executescript(sql_script, /)
14027db96d56Sopenharmony_ci
14037db96d56Sopenharmony_ci      Execute the SQL statements in *sql_script*.
14047db96d56Sopenharmony_ci      If there is a pending transaction,
14057db96d56Sopenharmony_ci      an implicit ``COMMIT`` statement is executed first.
14067db96d56Sopenharmony_ci      No other implicit transaction control is performed;
14077db96d56Sopenharmony_ci      any transaction control must be added to *sql_script*.
14087db96d56Sopenharmony_ci
14097db96d56Sopenharmony_ci      *sql_script* must be a :class:`string <str>`.
14107db96d56Sopenharmony_ci
14117db96d56Sopenharmony_ci      Example:
14127db96d56Sopenharmony_ci
14137db96d56Sopenharmony_ci      .. testcode:: sqlite3.cursor
14147db96d56Sopenharmony_ci
14157db96d56Sopenharmony_ci         # cur is an sqlite3.Cursor object
14167db96d56Sopenharmony_ci         cur.executescript("""
14177db96d56Sopenharmony_ci             BEGIN;
14187db96d56Sopenharmony_ci             CREATE TABLE person(firstname, lastname, age);
14197db96d56Sopenharmony_ci             CREATE TABLE book(title, author, published);
14207db96d56Sopenharmony_ci             CREATE TABLE publisher(name, address);
14217db96d56Sopenharmony_ci             COMMIT;
14227db96d56Sopenharmony_ci         """)
14237db96d56Sopenharmony_ci
14247db96d56Sopenharmony_ci
14257db96d56Sopenharmony_ci   .. method:: fetchone()
14267db96d56Sopenharmony_ci
14277db96d56Sopenharmony_ci      If :attr:`~Cursor.row_factory` is ``None``,
14287db96d56Sopenharmony_ci      return the next row query result set as a :class:`tuple`.
14297db96d56Sopenharmony_ci      Else, pass it to the row factory and return its result.
14307db96d56Sopenharmony_ci      Return ``None`` if no more data is available.
14317db96d56Sopenharmony_ci
14327db96d56Sopenharmony_ci
14337db96d56Sopenharmony_ci   .. method:: fetchmany(size=cursor.arraysize)
14347db96d56Sopenharmony_ci
14357db96d56Sopenharmony_ci      Return the next set of rows of a query result as a :class:`list`.
14367db96d56Sopenharmony_ci      Return an empty list if no more rows are available.
14377db96d56Sopenharmony_ci
14387db96d56Sopenharmony_ci      The number of rows to fetch per call is specified by the *size* parameter.
14397db96d56Sopenharmony_ci      If *size* is not given, :attr:`arraysize` determines the number of rows
14407db96d56Sopenharmony_ci      to be fetched.
14417db96d56Sopenharmony_ci      If fewer than *size* rows are available,
14427db96d56Sopenharmony_ci      as many rows as are available are returned.
14437db96d56Sopenharmony_ci
14447db96d56Sopenharmony_ci      Note there are performance considerations involved with the *size* parameter.
14457db96d56Sopenharmony_ci      For optimal performance, it is usually best to use the arraysize attribute.
14467db96d56Sopenharmony_ci      If the *size* parameter is used, then it is best for it to retain the same
14477db96d56Sopenharmony_ci      value from one :meth:`fetchmany` call to the next.
14487db96d56Sopenharmony_ci
14497db96d56Sopenharmony_ci   .. method:: fetchall()
14507db96d56Sopenharmony_ci
14517db96d56Sopenharmony_ci      Return all (remaining) rows of a query result as a :class:`list`.
14527db96d56Sopenharmony_ci      Return an empty list if no rows are available.
14537db96d56Sopenharmony_ci      Note that the :attr:`arraysize` attribute can affect the performance of
14547db96d56Sopenharmony_ci      this operation.
14557db96d56Sopenharmony_ci
14567db96d56Sopenharmony_ci   .. method:: close()
14577db96d56Sopenharmony_ci
14587db96d56Sopenharmony_ci      Close the cursor now (rather than whenever ``__del__`` is called).
14597db96d56Sopenharmony_ci
14607db96d56Sopenharmony_ci      The cursor will be unusable from this point forward; a :exc:`ProgrammingError`
14617db96d56Sopenharmony_ci      exception will be raised if any operation is attempted with the cursor.
14627db96d56Sopenharmony_ci
14637db96d56Sopenharmony_ci   .. method:: setinputsizes(sizes, /)
14647db96d56Sopenharmony_ci
14657db96d56Sopenharmony_ci      Required by the DB-API. Does nothing in :mod:`!sqlite3`.
14667db96d56Sopenharmony_ci
14677db96d56Sopenharmony_ci   .. method:: setoutputsize(size, column=None, /)
14687db96d56Sopenharmony_ci
14697db96d56Sopenharmony_ci      Required by the DB-API. Does nothing in :mod:`!sqlite3`.
14707db96d56Sopenharmony_ci
14717db96d56Sopenharmony_ci   .. attribute:: arraysize
14727db96d56Sopenharmony_ci
14737db96d56Sopenharmony_ci      Read/write attribute that controls the number of rows returned by :meth:`fetchmany`.
14747db96d56Sopenharmony_ci      The default value is 1 which means a single row would be fetched per call.
14757db96d56Sopenharmony_ci
14767db96d56Sopenharmony_ci   .. attribute:: connection
14777db96d56Sopenharmony_ci
14787db96d56Sopenharmony_ci      Read-only attribute that provides the SQLite database :class:`Connection`
14797db96d56Sopenharmony_ci      belonging to the cursor.  A :class:`Cursor` object created by
14807db96d56Sopenharmony_ci      calling :meth:`con.cursor() <Connection.cursor>` will have a
14817db96d56Sopenharmony_ci      :attr:`connection` attribute that refers to *con*:
14827db96d56Sopenharmony_ci
14837db96d56Sopenharmony_ci      .. doctest::
14847db96d56Sopenharmony_ci
14857db96d56Sopenharmony_ci         >>> con = sqlite3.connect(":memory:")
14867db96d56Sopenharmony_ci         >>> cur = con.cursor()
14877db96d56Sopenharmony_ci         >>> cur.connection == con
14887db96d56Sopenharmony_ci         True
14897db96d56Sopenharmony_ci
14907db96d56Sopenharmony_ci   .. attribute:: description
14917db96d56Sopenharmony_ci
14927db96d56Sopenharmony_ci      Read-only attribute that provides the column names of the last query. To
14937db96d56Sopenharmony_ci      remain compatible with the Python DB API, it returns a 7-tuple for each
14947db96d56Sopenharmony_ci      column where the last six items of each tuple are ``None``.
14957db96d56Sopenharmony_ci
14967db96d56Sopenharmony_ci      It is set for ``SELECT`` statements without any matching rows as well.
14977db96d56Sopenharmony_ci
14987db96d56Sopenharmony_ci   .. attribute:: lastrowid
14997db96d56Sopenharmony_ci
15007db96d56Sopenharmony_ci      Read-only attribute that provides the row id of the last inserted row. It
15017db96d56Sopenharmony_ci      is only updated after successful ``INSERT`` or ``REPLACE`` statements
15027db96d56Sopenharmony_ci      using the :meth:`execute` method.  For other statements, after
15037db96d56Sopenharmony_ci      :meth:`executemany` or :meth:`executescript`, or if the insertion failed,
15047db96d56Sopenharmony_ci      the value of ``lastrowid`` is left unchanged.  The initial value of
15057db96d56Sopenharmony_ci      ``lastrowid`` is ``None``.
15067db96d56Sopenharmony_ci
15077db96d56Sopenharmony_ci      .. note::
15087db96d56Sopenharmony_ci         Inserts into ``WITHOUT ROWID`` tables are not recorded.
15097db96d56Sopenharmony_ci
15107db96d56Sopenharmony_ci      .. versionchanged:: 3.6
15117db96d56Sopenharmony_ci         Added support for the ``REPLACE`` statement.
15127db96d56Sopenharmony_ci
15137db96d56Sopenharmony_ci   .. attribute:: rowcount
15147db96d56Sopenharmony_ci
15157db96d56Sopenharmony_ci      Read-only attribute that provides the number of modified rows for
15167db96d56Sopenharmony_ci      ``INSERT``, ``UPDATE``, ``DELETE``, and ``REPLACE`` statements;
15177db96d56Sopenharmony_ci      is ``-1`` for other statements,
15187db96d56Sopenharmony_ci      including :abbr:`CTE (Common Table Expression)` queries.
15197db96d56Sopenharmony_ci      It is only updated by the :meth:`execute` and :meth:`executemany` methods,
15207db96d56Sopenharmony_ci      after the statement has run to completion.
15217db96d56Sopenharmony_ci      This means that any resulting rows must be fetched in order for
15227db96d56Sopenharmony_ci      :attr:`!rowcount` to be updated.
15237db96d56Sopenharmony_ci
15247db96d56Sopenharmony_ci   .. attribute:: row_factory
15257db96d56Sopenharmony_ci
15267db96d56Sopenharmony_ci      Control how a row fetched from this :class:`!Cursor` is represented.
15277db96d56Sopenharmony_ci      If ``None``, a row is represented as a :class:`tuple`.
15287db96d56Sopenharmony_ci      Can be set to the included :class:`sqlite3.Row`;
15297db96d56Sopenharmony_ci      or a :term:`callable` that accepts two arguments,
15307db96d56Sopenharmony_ci      a :class:`Cursor` object and the :class:`!tuple` of row values,
15317db96d56Sopenharmony_ci      and returns a custom object representing an SQLite row.
15327db96d56Sopenharmony_ci
15337db96d56Sopenharmony_ci      Defaults to what :attr:`Connection.row_factory` was set to
15347db96d56Sopenharmony_ci      when the :class:`!Cursor` was created.
15357db96d56Sopenharmony_ci      Assigning to this attribute does not affect
15367db96d56Sopenharmony_ci      :attr:`Connection.row_factory` of the parent connection.
15377db96d56Sopenharmony_ci
15387db96d56Sopenharmony_ci      See :ref:`sqlite3-howto-row-factory` for more details.
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ci
15417db96d56Sopenharmony_ci.. The sqlite3.Row example used to be a how-to. It has now been incorporated
15427db96d56Sopenharmony_ci   into the Row reference. We keep the anchor here in order not to break
15437db96d56Sopenharmony_ci   existing links.
15447db96d56Sopenharmony_ci
15457db96d56Sopenharmony_ci.. _sqlite3-columns-by-name:
15467db96d56Sopenharmony_ci.. _sqlite3-row-objects:
15477db96d56Sopenharmony_ci
15487db96d56Sopenharmony_ciRow objects
15497db96d56Sopenharmony_ci^^^^^^^^^^^
15507db96d56Sopenharmony_ci
15517db96d56Sopenharmony_ci.. class:: Row
15527db96d56Sopenharmony_ci
15537db96d56Sopenharmony_ci   A :class:`!Row` instance serves as a highly optimized
15547db96d56Sopenharmony_ci   :attr:`~Connection.row_factory` for :class:`Connection` objects.
15557db96d56Sopenharmony_ci   It supports iteration, equality testing, :func:`len`,
15567db96d56Sopenharmony_ci   and :term:`mapping` access by column name and index.
15577db96d56Sopenharmony_ci
15587db96d56Sopenharmony_ci   Two :class:`!Row` objects compare equal
15597db96d56Sopenharmony_ci   if they have identical column names and values.
15607db96d56Sopenharmony_ci
15617db96d56Sopenharmony_ci   See :ref:`sqlite3-howto-row-factory` for more details.
15627db96d56Sopenharmony_ci
15637db96d56Sopenharmony_ci   .. method:: keys
15647db96d56Sopenharmony_ci
15657db96d56Sopenharmony_ci      Return a :class:`list` of column names as :class:`strings <str>`.
15667db96d56Sopenharmony_ci      Immediately after a query,
15677db96d56Sopenharmony_ci      it is the first member of each tuple in :attr:`Cursor.description`.
15687db96d56Sopenharmony_ci
15697db96d56Sopenharmony_ci   .. versionchanged:: 3.5
15707db96d56Sopenharmony_ci      Added support of slicing.
15717db96d56Sopenharmony_ci
15727db96d56Sopenharmony_ci
15737db96d56Sopenharmony_ci.. _sqlite3-blob-objects:
15747db96d56Sopenharmony_ci
15757db96d56Sopenharmony_ciBlob objects
15767db96d56Sopenharmony_ci^^^^^^^^^^^^
15777db96d56Sopenharmony_ci
15787db96d56Sopenharmony_ci.. versionadded:: 3.11
15797db96d56Sopenharmony_ci
15807db96d56Sopenharmony_ci.. class:: Blob
15817db96d56Sopenharmony_ci
15827db96d56Sopenharmony_ci   A :class:`Blob` instance is a :term:`file-like object`
15837db96d56Sopenharmony_ci   that can read and write data in an SQLite :abbr:`BLOB (Binary Large OBject)`.
15847db96d56Sopenharmony_ci   Call :func:`len(blob) <len>` to get the size (number of bytes) of the blob.
15857db96d56Sopenharmony_ci   Use indices and :term:`slices <slice>` for direct access to the blob data.
15867db96d56Sopenharmony_ci
15877db96d56Sopenharmony_ci   Use the :class:`Blob` as a :term:`context manager` to ensure that the blob
15887db96d56Sopenharmony_ci   handle is closed after use.
15897db96d56Sopenharmony_ci
15907db96d56Sopenharmony_ci   .. testcode::
15917db96d56Sopenharmony_ci
15927db96d56Sopenharmony_ci      con = sqlite3.connect(":memory:")
15937db96d56Sopenharmony_ci      con.execute("CREATE TABLE test(blob_col blob)")
15947db96d56Sopenharmony_ci      con.execute("INSERT INTO test(blob_col) VALUES(zeroblob(13))")
15957db96d56Sopenharmony_ci
15967db96d56Sopenharmony_ci      # Write to our blob, using two write operations:
15977db96d56Sopenharmony_ci      with con.blobopen("test", "blob_col", 1) as blob:
15987db96d56Sopenharmony_ci          blob.write(b"hello, ")
15997db96d56Sopenharmony_ci          blob.write(b"world.")
16007db96d56Sopenharmony_ci          # Modify the first and last bytes of our blob
16017db96d56Sopenharmony_ci          blob[0] = ord("H")
16027db96d56Sopenharmony_ci          blob[-1] = ord("!")
16037db96d56Sopenharmony_ci
16047db96d56Sopenharmony_ci      # Read the contents of our blob
16057db96d56Sopenharmony_ci      with con.blobopen("test", "blob_col", 1) as blob:
16067db96d56Sopenharmony_ci          greeting = blob.read()
16077db96d56Sopenharmony_ci
16087db96d56Sopenharmony_ci      print(greeting)  # outputs "b'Hello, world!'"
16097db96d56Sopenharmony_ci
16107db96d56Sopenharmony_ci   .. testoutput::
16117db96d56Sopenharmony_ci      :hide:
16127db96d56Sopenharmony_ci
16137db96d56Sopenharmony_ci      b'Hello, world!'
16147db96d56Sopenharmony_ci
16157db96d56Sopenharmony_ci   .. method:: close()
16167db96d56Sopenharmony_ci
16177db96d56Sopenharmony_ci      Close the blob.
16187db96d56Sopenharmony_ci
16197db96d56Sopenharmony_ci      The blob will be unusable from this point onward.  An
16207db96d56Sopenharmony_ci      :class:`~sqlite3.Error` (or subclass) exception will be raised if any
16217db96d56Sopenharmony_ci      further operation is attempted with the blob.
16227db96d56Sopenharmony_ci
16237db96d56Sopenharmony_ci   .. method:: read(length=-1, /)
16247db96d56Sopenharmony_ci
16257db96d56Sopenharmony_ci      Read *length* bytes of data from the blob at the current offset position.
16267db96d56Sopenharmony_ci      If the end of the blob is reached, the data up to
16277db96d56Sopenharmony_ci      :abbr:`EOF (End of File)` will be returned.  When *length* is not
16287db96d56Sopenharmony_ci      specified, or is negative, :meth:`~Blob.read` will read until the end of
16297db96d56Sopenharmony_ci      the blob.
16307db96d56Sopenharmony_ci
16317db96d56Sopenharmony_ci   .. method:: write(data, /)
16327db96d56Sopenharmony_ci
16337db96d56Sopenharmony_ci      Write *data* to the blob at the current offset.  This function cannot
16347db96d56Sopenharmony_ci      change the blob length.  Writing beyond the end of the blob will raise
16357db96d56Sopenharmony_ci      :exc:`ValueError`.
16367db96d56Sopenharmony_ci
16377db96d56Sopenharmony_ci   .. method:: tell()
16387db96d56Sopenharmony_ci
16397db96d56Sopenharmony_ci      Return the current access position of the blob.
16407db96d56Sopenharmony_ci
16417db96d56Sopenharmony_ci   .. method:: seek(offset, origin=os.SEEK_SET, /)
16427db96d56Sopenharmony_ci
16437db96d56Sopenharmony_ci      Set the current access position of the blob to *offset*.  The *origin*
16447db96d56Sopenharmony_ci      argument defaults to :data:`os.SEEK_SET` (absolute blob positioning).
16457db96d56Sopenharmony_ci      Other values for *origin* are :data:`os.SEEK_CUR` (seek relative to the
16467db96d56Sopenharmony_ci      current position) and :data:`os.SEEK_END` (seek relative to the blob’s
16477db96d56Sopenharmony_ci      end).
16487db96d56Sopenharmony_ci
16497db96d56Sopenharmony_ci
16507db96d56Sopenharmony_ciPrepareProtocol objects
16517db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^
16527db96d56Sopenharmony_ci
16537db96d56Sopenharmony_ci.. class:: PrepareProtocol
16547db96d56Sopenharmony_ci
16557db96d56Sopenharmony_ci   The PrepareProtocol type's single purpose is to act as a :pep:`246` style
16567db96d56Sopenharmony_ci   adaption protocol for objects that can :ref:`adapt themselves
16577db96d56Sopenharmony_ci   <sqlite3-conform>` to :ref:`native SQLite types <sqlite3-types>`.
16587db96d56Sopenharmony_ci
16597db96d56Sopenharmony_ci
16607db96d56Sopenharmony_ci.. _sqlite3-exceptions:
16617db96d56Sopenharmony_ci
16627db96d56Sopenharmony_ciExceptions
16637db96d56Sopenharmony_ci^^^^^^^^^^
16647db96d56Sopenharmony_ci
16657db96d56Sopenharmony_ciThe exception hierarchy is defined by the DB-API 2.0 (:pep:`249`).
16667db96d56Sopenharmony_ci
16677db96d56Sopenharmony_ci.. exception:: Warning
16687db96d56Sopenharmony_ci
16697db96d56Sopenharmony_ci   This exception is not currently raised by the :mod:`!sqlite3` module,
16707db96d56Sopenharmony_ci   but may be raised by applications using :mod:`!sqlite3`,
16717db96d56Sopenharmony_ci   for example if a user-defined function truncates data while inserting.
16727db96d56Sopenharmony_ci   ``Warning`` is a subclass of :exc:`Exception`.
16737db96d56Sopenharmony_ci
16747db96d56Sopenharmony_ci.. exception:: Error
16757db96d56Sopenharmony_ci
16767db96d56Sopenharmony_ci   The base class of the other exceptions in this module.
16777db96d56Sopenharmony_ci   Use this to catch all errors with one single :keyword:`except` statement.
16787db96d56Sopenharmony_ci   ``Error`` is a subclass of :exc:`Exception`.
16797db96d56Sopenharmony_ci
16807db96d56Sopenharmony_ci   If the exception originated from within the SQLite library,
16817db96d56Sopenharmony_ci   the following two attributes are added to the exception:
16827db96d56Sopenharmony_ci
16837db96d56Sopenharmony_ci   .. attribute:: sqlite_errorcode
16847db96d56Sopenharmony_ci
16857db96d56Sopenharmony_ci      The numeric error code from the
16867db96d56Sopenharmony_ci      `SQLite API <https://sqlite.org/rescode.html>`_
16877db96d56Sopenharmony_ci
16887db96d56Sopenharmony_ci      .. versionadded:: 3.11
16897db96d56Sopenharmony_ci
16907db96d56Sopenharmony_ci   .. attribute:: sqlite_errorname
16917db96d56Sopenharmony_ci
16927db96d56Sopenharmony_ci      The symbolic name of the numeric error code
16937db96d56Sopenharmony_ci      from the `SQLite API <https://sqlite.org/rescode.html>`_
16947db96d56Sopenharmony_ci
16957db96d56Sopenharmony_ci      .. versionadded:: 3.11
16967db96d56Sopenharmony_ci
16977db96d56Sopenharmony_ci.. exception:: InterfaceError
16987db96d56Sopenharmony_ci
16997db96d56Sopenharmony_ci   Exception raised for misuse of the low-level SQLite C API.
17007db96d56Sopenharmony_ci   In other words, if this exception is raised, it probably indicates a bug in the
17017db96d56Sopenharmony_ci   :mod:`!sqlite3` module.
17027db96d56Sopenharmony_ci   ``InterfaceError`` is a subclass of :exc:`Error`.
17037db96d56Sopenharmony_ci
17047db96d56Sopenharmony_ci.. exception:: DatabaseError
17057db96d56Sopenharmony_ci
17067db96d56Sopenharmony_ci   Exception raised for errors that are related to the database.
17077db96d56Sopenharmony_ci   This serves as the base exception for several types of database errors.
17087db96d56Sopenharmony_ci   It is only raised implicitly through the specialised subclasses.
17097db96d56Sopenharmony_ci   ``DatabaseError`` is a subclass of :exc:`Error`.
17107db96d56Sopenharmony_ci
17117db96d56Sopenharmony_ci.. exception:: DataError
17127db96d56Sopenharmony_ci
17137db96d56Sopenharmony_ci   Exception raised for errors caused by problems with the processed data,
17147db96d56Sopenharmony_ci   like numeric values out of range, and strings which are too long.
17157db96d56Sopenharmony_ci   ``DataError`` is a subclass of :exc:`DatabaseError`.
17167db96d56Sopenharmony_ci
17177db96d56Sopenharmony_ci.. exception:: OperationalError
17187db96d56Sopenharmony_ci
17197db96d56Sopenharmony_ci   Exception raised for errors that are related to the database's operation,
17207db96d56Sopenharmony_ci   and not necessarily under the control of the programmer.
17217db96d56Sopenharmony_ci   For example, the database path is not found,
17227db96d56Sopenharmony_ci   or a transaction could not be processed.
17237db96d56Sopenharmony_ci   ``OperationalError`` is a subclass of :exc:`DatabaseError`.
17247db96d56Sopenharmony_ci
17257db96d56Sopenharmony_ci.. exception:: IntegrityError
17267db96d56Sopenharmony_ci
17277db96d56Sopenharmony_ci   Exception raised when the relational integrity of the database is affected,
17287db96d56Sopenharmony_ci   e.g. a foreign key check fails.  It is a subclass of :exc:`DatabaseError`.
17297db96d56Sopenharmony_ci
17307db96d56Sopenharmony_ci.. exception:: InternalError
17317db96d56Sopenharmony_ci
17327db96d56Sopenharmony_ci   Exception raised when SQLite encounters an internal error.
17337db96d56Sopenharmony_ci   If this is raised, it may indicate that there is a problem with the runtime
17347db96d56Sopenharmony_ci   SQLite library.
17357db96d56Sopenharmony_ci   ``InternalError`` is a subclass of :exc:`DatabaseError`.
17367db96d56Sopenharmony_ci
17377db96d56Sopenharmony_ci.. exception:: ProgrammingError
17387db96d56Sopenharmony_ci
17397db96d56Sopenharmony_ci   Exception raised for :mod:`!sqlite3` API programming errors,
17407db96d56Sopenharmony_ci   for example supplying the wrong number of bindings to a query,
17417db96d56Sopenharmony_ci   or trying to operate on a closed :class:`Connection`.
17427db96d56Sopenharmony_ci   ``ProgrammingError`` is a subclass of :exc:`DatabaseError`.
17437db96d56Sopenharmony_ci
17447db96d56Sopenharmony_ci.. exception:: NotSupportedError
17457db96d56Sopenharmony_ci
17467db96d56Sopenharmony_ci   Exception raised in case a method or database API is not supported by the
17477db96d56Sopenharmony_ci   underlying SQLite library. For example, setting *deterministic* to
17487db96d56Sopenharmony_ci   ``True`` in :meth:`~Connection.create_function`, if the underlying SQLite library
17497db96d56Sopenharmony_ci   does not support deterministic functions.
17507db96d56Sopenharmony_ci   ``NotSupportedError`` is a subclass of :exc:`DatabaseError`.
17517db96d56Sopenharmony_ci
17527db96d56Sopenharmony_ci
17537db96d56Sopenharmony_ci.. _sqlite3-types:
17547db96d56Sopenharmony_ci
17557db96d56Sopenharmony_ciSQLite and Python types
17567db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^
17577db96d56Sopenharmony_ci
17587db96d56Sopenharmony_ciSQLite natively supports the following types: ``NULL``, ``INTEGER``,
17597db96d56Sopenharmony_ci``REAL``, ``TEXT``, ``BLOB``.
17607db96d56Sopenharmony_ci
17617db96d56Sopenharmony_ciThe following Python types can thus be sent to SQLite without any problem:
17627db96d56Sopenharmony_ci
17637db96d56Sopenharmony_ci+-------------------------------+-------------+
17647db96d56Sopenharmony_ci| Python type                   | SQLite type |
17657db96d56Sopenharmony_ci+===============================+=============+
17667db96d56Sopenharmony_ci| ``None``                      | ``NULL``    |
17677db96d56Sopenharmony_ci+-------------------------------+-------------+
17687db96d56Sopenharmony_ci| :class:`int`                  | ``INTEGER`` |
17697db96d56Sopenharmony_ci+-------------------------------+-------------+
17707db96d56Sopenharmony_ci| :class:`float`                | ``REAL``    |
17717db96d56Sopenharmony_ci+-------------------------------+-------------+
17727db96d56Sopenharmony_ci| :class:`str`                  | ``TEXT``    |
17737db96d56Sopenharmony_ci+-------------------------------+-------------+
17747db96d56Sopenharmony_ci| :class:`bytes`                | ``BLOB``    |
17757db96d56Sopenharmony_ci+-------------------------------+-------------+
17767db96d56Sopenharmony_ci
17777db96d56Sopenharmony_ci
17787db96d56Sopenharmony_ciThis is how SQLite types are converted to Python types by default:
17797db96d56Sopenharmony_ci
17807db96d56Sopenharmony_ci+-------------+----------------------------------------------+
17817db96d56Sopenharmony_ci| SQLite type | Python type                                  |
17827db96d56Sopenharmony_ci+=============+==============================================+
17837db96d56Sopenharmony_ci| ``NULL``    | ``None``                                     |
17847db96d56Sopenharmony_ci+-------------+----------------------------------------------+
17857db96d56Sopenharmony_ci| ``INTEGER`` | :class:`int`                                 |
17867db96d56Sopenharmony_ci+-------------+----------------------------------------------+
17877db96d56Sopenharmony_ci| ``REAL``    | :class:`float`                               |
17887db96d56Sopenharmony_ci+-------------+----------------------------------------------+
17897db96d56Sopenharmony_ci| ``TEXT``    | depends on :attr:`~Connection.text_factory`, |
17907db96d56Sopenharmony_ci|             | :class:`str` by default                      |
17917db96d56Sopenharmony_ci+-------------+----------------------------------------------+
17927db96d56Sopenharmony_ci| ``BLOB``    | :class:`bytes`                               |
17937db96d56Sopenharmony_ci+-------------+----------------------------------------------+
17947db96d56Sopenharmony_ci
17957db96d56Sopenharmony_ciThe type system of the :mod:`!sqlite3` module is extensible in two ways: you can
17967db96d56Sopenharmony_cistore additional Python types in an SQLite database via
17977db96d56Sopenharmony_ci:ref:`object adapters <sqlite3-adapters>`,
17987db96d56Sopenharmony_ciand you can let the :mod:`!sqlite3` module convert SQLite types to
17997db96d56Sopenharmony_ciPython types via :ref:`converters <sqlite3-converters>`.
18007db96d56Sopenharmony_ci
18017db96d56Sopenharmony_ci
18027db96d56Sopenharmony_ci.. _sqlite3-default-converters:
18037db96d56Sopenharmony_ci
18047db96d56Sopenharmony_ciDefault adapters and converters
18057db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
18067db96d56Sopenharmony_ci
18077db96d56Sopenharmony_ciThere are default adapters for the date and datetime types in the datetime
18087db96d56Sopenharmony_cimodule. They will be sent as ISO dates/ISO timestamps to SQLite.
18097db96d56Sopenharmony_ci
18107db96d56Sopenharmony_ciThe default converters are registered under the name "date" for
18117db96d56Sopenharmony_ci:class:`datetime.date` and under the name "timestamp" for
18127db96d56Sopenharmony_ci:class:`datetime.datetime`.
18137db96d56Sopenharmony_ci
18147db96d56Sopenharmony_ciThis way, you can use date/timestamps from Python without any additional
18157db96d56Sopenharmony_cifiddling in most cases. The format of the adapters is also compatible with the
18167db96d56Sopenharmony_ciexperimental SQLite date/time functions.
18177db96d56Sopenharmony_ci
18187db96d56Sopenharmony_ciThe following example demonstrates this.
18197db96d56Sopenharmony_ci
18207db96d56Sopenharmony_ci.. literalinclude:: ../includes/sqlite3/pysqlite_datetime.py
18217db96d56Sopenharmony_ci
18227db96d56Sopenharmony_ciIf a timestamp stored in SQLite has a fractional part longer than 6
18237db96d56Sopenharmony_cinumbers, its value will be truncated to microsecond precision by the
18247db96d56Sopenharmony_citimestamp converter.
18257db96d56Sopenharmony_ci
18267db96d56Sopenharmony_ci.. note::
18277db96d56Sopenharmony_ci
18287db96d56Sopenharmony_ci   The default "timestamp" converter ignores UTC offsets in the database and
18297db96d56Sopenharmony_ci   always returns a naive :class:`datetime.datetime` object. To preserve UTC
18307db96d56Sopenharmony_ci   offsets in timestamps, either leave converters disabled, or register an
18317db96d56Sopenharmony_ci   offset-aware converter with :func:`register_converter`.
18327db96d56Sopenharmony_ci
18337db96d56Sopenharmony_ci
18347db96d56Sopenharmony_ci.. _sqlite3-howtos:
18357db96d56Sopenharmony_ci
18367db96d56Sopenharmony_ciHow-to guides
18377db96d56Sopenharmony_ci-------------
18387db96d56Sopenharmony_ci
18397db96d56Sopenharmony_ci.. _sqlite3-placeholders:
18407db96d56Sopenharmony_ci
18417db96d56Sopenharmony_ciHow to use placeholders to bind values in SQL queries
18427db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
18437db96d56Sopenharmony_ci
18447db96d56Sopenharmony_ciSQL operations usually need to use values from Python variables. However,
18457db96d56Sopenharmony_cibeware of using Python's string operations to assemble queries, as they
18467db96d56Sopenharmony_ciare vulnerable to `SQL injection attacks`_. For example, an attacker can simply
18477db96d56Sopenharmony_ciclose the single quote and inject ``OR TRUE`` to select all rows::
18487db96d56Sopenharmony_ci
18497db96d56Sopenharmony_ci   >>> # Never do this -- insecure!
18507db96d56Sopenharmony_ci   >>> symbol = input()
18517db96d56Sopenharmony_ci   ' OR TRUE; --
18527db96d56Sopenharmony_ci   >>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
18537db96d56Sopenharmony_ci   >>> print(sql)
18547db96d56Sopenharmony_ci   SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'
18557db96d56Sopenharmony_ci   >>> cur.execute(sql)
18567db96d56Sopenharmony_ci
18577db96d56Sopenharmony_ciInstead, use the DB-API's parameter substitution. To insert a variable into a
18587db96d56Sopenharmony_ciquery string, use a placeholder in the string, and substitute the actual values
18597db96d56Sopenharmony_ciinto the query by providing them as a :class:`tuple` of values to the second
18607db96d56Sopenharmony_ciargument of the cursor's :meth:`~Cursor.execute` method.
18617db96d56Sopenharmony_ci
18627db96d56Sopenharmony_ciAn SQL statement may use one of two kinds of placeholders:
18637db96d56Sopenharmony_ciquestion marks (qmark style) or named placeholders (named style).
18647db96d56Sopenharmony_ciFor the qmark style, *parameters* must be a
18657db96d56Sopenharmony_ci:term:`sequence` whose length must match the number of placeholders,
18667db96d56Sopenharmony_cior a :exc:`ProgrammingError` is raised.
18677db96d56Sopenharmony_ciFor the named style, *parameters* should be
18687db96d56Sopenharmony_cian instance of a :class:`dict` (or a subclass),
18697db96d56Sopenharmony_ciwhich must contain keys for all named parameters;
18707db96d56Sopenharmony_ciany extra items are ignored.
18717db96d56Sopenharmony_ciHere's an example of both styles:
18727db96d56Sopenharmony_ci
18737db96d56Sopenharmony_ci.. testcode::
18747db96d56Sopenharmony_ci
18757db96d56Sopenharmony_ci   con = sqlite3.connect(":memory:")
18767db96d56Sopenharmony_ci   cur = con.execute("CREATE TABLE lang(name, first_appeared)")
18777db96d56Sopenharmony_ci
18787db96d56Sopenharmony_ci   # This is the named style used with executemany():
18797db96d56Sopenharmony_ci   data = (
18807db96d56Sopenharmony_ci       {"name": "C", "year": 1972},
18817db96d56Sopenharmony_ci       {"name": "Fortran", "year": 1957},
18827db96d56Sopenharmony_ci       {"name": "Python", "year": 1991},
18837db96d56Sopenharmony_ci       {"name": "Go", "year": 2009},
18847db96d56Sopenharmony_ci   )
18857db96d56Sopenharmony_ci   cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)
18867db96d56Sopenharmony_ci
18877db96d56Sopenharmony_ci   # This is the qmark style used in a SELECT query:
18887db96d56Sopenharmony_ci   params = (1972,)
18897db96d56Sopenharmony_ci   cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
18907db96d56Sopenharmony_ci   print(cur.fetchall())
18917db96d56Sopenharmony_ci
18927db96d56Sopenharmony_ci.. testoutput::
18937db96d56Sopenharmony_ci   :hide:
18947db96d56Sopenharmony_ci
18957db96d56Sopenharmony_ci   [('C', 1972)]
18967db96d56Sopenharmony_ci
18977db96d56Sopenharmony_ci.. note::
18987db96d56Sopenharmony_ci
18997db96d56Sopenharmony_ci   :pep:`249` numeric placeholders are *not* supported.
19007db96d56Sopenharmony_ci   If used, they will be interpreted as named placeholders.
19017db96d56Sopenharmony_ci
19027db96d56Sopenharmony_ci
19037db96d56Sopenharmony_ci.. _sqlite3-adapters:
19047db96d56Sopenharmony_ci
19057db96d56Sopenharmony_ciHow to adapt custom Python types to SQLite values
19067db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
19077db96d56Sopenharmony_ci
19087db96d56Sopenharmony_ciSQLite supports only a limited set of data types natively.
19097db96d56Sopenharmony_ciTo store custom Python types in SQLite databases, *adapt* them to one of the
19107db96d56Sopenharmony_ci:ref:`Python types SQLite natively understands <sqlite3-types>`.
19117db96d56Sopenharmony_ci
19127db96d56Sopenharmony_ciThere are two ways to adapt Python objects to SQLite types:
19137db96d56Sopenharmony_ciletting your object adapt itself, or using an *adapter callable*.
19147db96d56Sopenharmony_ciThe latter will take precedence above the former.
19157db96d56Sopenharmony_ciFor a library that exports a custom type,
19167db96d56Sopenharmony_ciit may make sense to enable that type to adapt itself.
19177db96d56Sopenharmony_ciAs an application developer, it may make more sense to take direct control by
19187db96d56Sopenharmony_ciregistering custom adapter functions.
19197db96d56Sopenharmony_ci
19207db96d56Sopenharmony_ci
19217db96d56Sopenharmony_ci.. _sqlite3-conform:
19227db96d56Sopenharmony_ci
19237db96d56Sopenharmony_ciHow to write adaptable objects
19247db96d56Sopenharmony_ci""""""""""""""""""""""""""""""
19257db96d56Sopenharmony_ci
19267db96d56Sopenharmony_ciSuppose we have a :class:`!Point` class that represents a pair of coordinates,
19277db96d56Sopenharmony_ci``x`` and ``y``, in a Cartesian coordinate system.
19287db96d56Sopenharmony_ciThe coordinate pair will be stored as a text string in the database,
19297db96d56Sopenharmony_ciusing a semicolon to separate the coordinates.
19307db96d56Sopenharmony_ciThis can be implemented by adding a ``__conform__(self, protocol)``
19317db96d56Sopenharmony_cimethod which returns the adapted value.
19327db96d56Sopenharmony_ciThe object passed to *protocol* will be of type :class:`PrepareProtocol`.
19337db96d56Sopenharmony_ci
19347db96d56Sopenharmony_ci.. testcode::
19357db96d56Sopenharmony_ci
19367db96d56Sopenharmony_ci   class Point:
19377db96d56Sopenharmony_ci       def __init__(self, x, y):
19387db96d56Sopenharmony_ci           self.x, self.y = x, y
19397db96d56Sopenharmony_ci
19407db96d56Sopenharmony_ci       def __conform__(self, protocol):
19417db96d56Sopenharmony_ci           if protocol is sqlite3.PrepareProtocol:
19427db96d56Sopenharmony_ci               return f"{self.x};{self.y}"
19437db96d56Sopenharmony_ci
19447db96d56Sopenharmony_ci   con = sqlite3.connect(":memory:")
19457db96d56Sopenharmony_ci   cur = con.cursor()
19467db96d56Sopenharmony_ci
19477db96d56Sopenharmony_ci   cur.execute("SELECT ?", (Point(4.0, -3.2),))
19487db96d56Sopenharmony_ci   print(cur.fetchone()[0])
19497db96d56Sopenharmony_ci
19507db96d56Sopenharmony_ci.. testoutput::
19517db96d56Sopenharmony_ci   :hide:
19527db96d56Sopenharmony_ci
19537db96d56Sopenharmony_ci   4.0;-3.2
19547db96d56Sopenharmony_ci
19557db96d56Sopenharmony_ci
19567db96d56Sopenharmony_ciHow to register adapter callables
19577db96d56Sopenharmony_ci"""""""""""""""""""""""""""""""""
19587db96d56Sopenharmony_ci
19597db96d56Sopenharmony_ciThe other possibility is to create a function that converts the Python object
19607db96d56Sopenharmony_cito an SQLite-compatible type.
19617db96d56Sopenharmony_ciThis function can then be registered using :func:`register_adapter`.
19627db96d56Sopenharmony_ci
19637db96d56Sopenharmony_ci.. testcode::
19647db96d56Sopenharmony_ci
19657db96d56Sopenharmony_ci   class Point:
19667db96d56Sopenharmony_ci       def __init__(self, x, y):
19677db96d56Sopenharmony_ci           self.x, self.y = x, y
19687db96d56Sopenharmony_ci
19697db96d56Sopenharmony_ci   def adapt_point(point):
19707db96d56Sopenharmony_ci       return f"{point.x};{point.y}"
19717db96d56Sopenharmony_ci
19727db96d56Sopenharmony_ci   sqlite3.register_adapter(Point, adapt_point)
19737db96d56Sopenharmony_ci
19747db96d56Sopenharmony_ci   con = sqlite3.connect(":memory:")
19757db96d56Sopenharmony_ci   cur = con.cursor()
19767db96d56Sopenharmony_ci
19777db96d56Sopenharmony_ci   cur.execute("SELECT ?", (Point(1.0, 2.5),))
19787db96d56Sopenharmony_ci   print(cur.fetchone()[0])
19797db96d56Sopenharmony_ci
19807db96d56Sopenharmony_ci.. testoutput::
19817db96d56Sopenharmony_ci   :hide:
19827db96d56Sopenharmony_ci
19837db96d56Sopenharmony_ci   1.0;2.5
19847db96d56Sopenharmony_ci
19857db96d56Sopenharmony_ci
19867db96d56Sopenharmony_ci.. _sqlite3-converters:
19877db96d56Sopenharmony_ci
19887db96d56Sopenharmony_ciHow to convert SQLite values to custom Python types
19897db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
19907db96d56Sopenharmony_ci
19917db96d56Sopenharmony_ciWriting an adapter lets you convert *from* custom Python types *to* SQLite
19927db96d56Sopenharmony_civalues.
19937db96d56Sopenharmony_ciTo be able to convert *from* SQLite values *to* custom Python types,
19947db96d56Sopenharmony_ciwe use *converters*.
19957db96d56Sopenharmony_ci
19967db96d56Sopenharmony_ciLet's go back to the :class:`!Point` class. We stored the x and y coordinates
19977db96d56Sopenharmony_ciseparated via semicolons as strings in SQLite.
19987db96d56Sopenharmony_ci
19997db96d56Sopenharmony_ciFirst, we'll define a converter function that accepts the string as a parameter
20007db96d56Sopenharmony_ciand constructs a :class:`!Point` object from it.
20017db96d56Sopenharmony_ci
20027db96d56Sopenharmony_ci.. note::
20037db96d56Sopenharmony_ci
20047db96d56Sopenharmony_ci   Converter functions are **always** passed a :class:`bytes` object,
20057db96d56Sopenharmony_ci   no matter the underlying SQLite data type.
20067db96d56Sopenharmony_ci
20077db96d56Sopenharmony_ci.. testcode::
20087db96d56Sopenharmony_ci
20097db96d56Sopenharmony_ci   def convert_point(s):
20107db96d56Sopenharmony_ci       x, y = map(float, s.split(b";"))
20117db96d56Sopenharmony_ci       return Point(x, y)
20127db96d56Sopenharmony_ci
20137db96d56Sopenharmony_ciWe now need to tell :mod:`!sqlite3` when it should convert a given SQLite value.
20147db96d56Sopenharmony_ciThis is done when connecting to a database, using the *detect_types* parameter
20157db96d56Sopenharmony_ciof :func:`connect`. There are three options:
20167db96d56Sopenharmony_ci
20177db96d56Sopenharmony_ci* Implicit: set *detect_types* to :const:`PARSE_DECLTYPES`
20187db96d56Sopenharmony_ci* Explicit: set *detect_types* to :const:`PARSE_COLNAMES`
20197db96d56Sopenharmony_ci* Both: set *detect_types* to
20207db96d56Sopenharmony_ci  ``sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES``.
20217db96d56Sopenharmony_ci  Column names take precedence over declared types.
20227db96d56Sopenharmony_ci
20237db96d56Sopenharmony_ciThe following example illustrates the implicit and explicit approaches:
20247db96d56Sopenharmony_ci
20257db96d56Sopenharmony_ci.. testcode::
20267db96d56Sopenharmony_ci
20277db96d56Sopenharmony_ci   class Point:
20287db96d56Sopenharmony_ci       def __init__(self, x, y):
20297db96d56Sopenharmony_ci           self.x, self.y = x, y
20307db96d56Sopenharmony_ci
20317db96d56Sopenharmony_ci       def __repr__(self):
20327db96d56Sopenharmony_ci           return f"Point({self.x}, {self.y})"
20337db96d56Sopenharmony_ci
20347db96d56Sopenharmony_ci   def adapt_point(point):
20357db96d56Sopenharmony_ci       return f"{point.x};{point.y}"
20367db96d56Sopenharmony_ci
20377db96d56Sopenharmony_ci   def convert_point(s):
20387db96d56Sopenharmony_ci       x, y = list(map(float, s.split(b";")))
20397db96d56Sopenharmony_ci       return Point(x, y)
20407db96d56Sopenharmony_ci
20417db96d56Sopenharmony_ci   # Register the adapter and converter
20427db96d56Sopenharmony_ci   sqlite3.register_adapter(Point, adapt_point)
20437db96d56Sopenharmony_ci   sqlite3.register_converter("point", convert_point)
20447db96d56Sopenharmony_ci
20457db96d56Sopenharmony_ci   # 1) Parse using declared types
20467db96d56Sopenharmony_ci   p = Point(4.0, -3.2)
20477db96d56Sopenharmony_ci   con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
20487db96d56Sopenharmony_ci   cur = con.execute("CREATE TABLE test(p point)")
20497db96d56Sopenharmony_ci
20507db96d56Sopenharmony_ci   cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
20517db96d56Sopenharmony_ci   cur.execute("SELECT p FROM test")
20527db96d56Sopenharmony_ci   print("with declared types:", cur.fetchone()[0])
20537db96d56Sopenharmony_ci   cur.close()
20547db96d56Sopenharmony_ci   con.close()
20557db96d56Sopenharmony_ci
20567db96d56Sopenharmony_ci   # 2) Parse using column names
20577db96d56Sopenharmony_ci   con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
20587db96d56Sopenharmony_ci   cur = con.execute("CREATE TABLE test(p)")
20597db96d56Sopenharmony_ci
20607db96d56Sopenharmony_ci   cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
20617db96d56Sopenharmony_ci   cur.execute('SELECT p AS "p [point]" FROM test')
20627db96d56Sopenharmony_ci   print("with column names:", cur.fetchone()[0])
20637db96d56Sopenharmony_ci
20647db96d56Sopenharmony_ci.. testoutput::
20657db96d56Sopenharmony_ci   :hide:
20667db96d56Sopenharmony_ci
20677db96d56Sopenharmony_ci   with declared types: Point(4.0, -3.2)
20687db96d56Sopenharmony_ci   with column names: Point(4.0, -3.2)
20697db96d56Sopenharmony_ci
20707db96d56Sopenharmony_ci
20717db96d56Sopenharmony_ci.. _sqlite3-adapter-converter-recipes:
20727db96d56Sopenharmony_ci
20737db96d56Sopenharmony_ciAdapter and converter recipes
20747db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
20757db96d56Sopenharmony_ci
20767db96d56Sopenharmony_ciThis section shows recipes for common adapters and converters.
20777db96d56Sopenharmony_ci
20787db96d56Sopenharmony_ci.. testcode::
20797db96d56Sopenharmony_ci
20807db96d56Sopenharmony_ci   import datetime
20817db96d56Sopenharmony_ci   import sqlite3
20827db96d56Sopenharmony_ci
20837db96d56Sopenharmony_ci   def adapt_date_iso(val):
20847db96d56Sopenharmony_ci       """Adapt datetime.date to ISO 8601 date."""
20857db96d56Sopenharmony_ci       return val.isoformat()
20867db96d56Sopenharmony_ci
20877db96d56Sopenharmony_ci   def adapt_datetime_iso(val):
20887db96d56Sopenharmony_ci       """Adapt datetime.datetime to timezone-naive ISO 8601 date."""
20897db96d56Sopenharmony_ci       return val.isoformat()
20907db96d56Sopenharmony_ci
20917db96d56Sopenharmony_ci   def adapt_datetime_epoch(val):
20927db96d56Sopenharmony_ci       """Adapt datetime.datetime to Unix timestamp."""
20937db96d56Sopenharmony_ci       return int(val.timestamp())
20947db96d56Sopenharmony_ci
20957db96d56Sopenharmony_ci   sqlite3.register_adapter(datetime.date, adapt_date_iso)
20967db96d56Sopenharmony_ci   sqlite3.register_adapter(datetime.datetime, adapt_datetime_iso)
20977db96d56Sopenharmony_ci   sqlite3.register_adapter(datetime.datetime, adapt_datetime_epoch)
20987db96d56Sopenharmony_ci
20997db96d56Sopenharmony_ci   def convert_date(val):
21007db96d56Sopenharmony_ci       """Convert ISO 8601 date to datetime.date object."""
21017db96d56Sopenharmony_ci       return datetime.date.fromisoformat(val.decode())
21027db96d56Sopenharmony_ci
21037db96d56Sopenharmony_ci   def convert_datetime(val):
21047db96d56Sopenharmony_ci       """Convert ISO 8601 datetime to datetime.datetime object."""
21057db96d56Sopenharmony_ci       return datetime.datetime.fromisoformat(val.decode())
21067db96d56Sopenharmony_ci
21077db96d56Sopenharmony_ci   def convert_timestamp(val):
21087db96d56Sopenharmony_ci       """Convert Unix epoch timestamp to datetime.datetime object."""
21097db96d56Sopenharmony_ci       return datetime.datetime.fromtimestamp(int(val))
21107db96d56Sopenharmony_ci
21117db96d56Sopenharmony_ci   sqlite3.register_converter("date", convert_date)
21127db96d56Sopenharmony_ci   sqlite3.register_converter("datetime", convert_datetime)
21137db96d56Sopenharmony_ci   sqlite3.register_converter("timestamp", convert_timestamp)
21147db96d56Sopenharmony_ci
21157db96d56Sopenharmony_ci.. testcode::
21167db96d56Sopenharmony_ci   :hide:
21177db96d56Sopenharmony_ci
21187db96d56Sopenharmony_ci   dt = datetime.datetime(2019, 5, 18, 15, 17, 8, 123456)
21197db96d56Sopenharmony_ci
21207db96d56Sopenharmony_ci   assert adapt_date_iso(dt.date()) == "2019-05-18"
21217db96d56Sopenharmony_ci   assert convert_date(b"2019-05-18") == dt.date()
21227db96d56Sopenharmony_ci
21237db96d56Sopenharmony_ci   assert adapt_datetime_iso(dt) == "2019-05-18T15:17:08.123456"
21247db96d56Sopenharmony_ci   assert convert_datetime(b"2019-05-18T15:17:08.123456") == dt
21257db96d56Sopenharmony_ci
21267db96d56Sopenharmony_ci   # Using current time as fromtimestamp() returns local date/time.
21277db96d56Sopenharmony_ci   # Droping microseconds as adapt_datetime_epoch truncates fractional second part.
21287db96d56Sopenharmony_ci   now = datetime.datetime.now().replace(microsecond=0)
21297db96d56Sopenharmony_ci   current_timestamp = int(now.timestamp())
21307db96d56Sopenharmony_ci
21317db96d56Sopenharmony_ci   assert adapt_datetime_epoch(now) == current_timestamp
21327db96d56Sopenharmony_ci   assert convert_timestamp(str(current_timestamp).encode()) == now
21337db96d56Sopenharmony_ci
21347db96d56Sopenharmony_ci
21357db96d56Sopenharmony_ci.. _sqlite3-connection-shortcuts:
21367db96d56Sopenharmony_ci
21377db96d56Sopenharmony_ciHow to use connection shortcut methods
21387db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
21397db96d56Sopenharmony_ci
21407db96d56Sopenharmony_ciUsing the :meth:`~Connection.execute`,
21417db96d56Sopenharmony_ci:meth:`~Connection.executemany`, and :meth:`~Connection.executescript`
21427db96d56Sopenharmony_cimethods of the :class:`Connection` class, your code can
21437db96d56Sopenharmony_cibe written more concisely because you don't have to create the (often
21447db96d56Sopenharmony_cisuperfluous) :class:`Cursor` objects explicitly. Instead, the :class:`Cursor`
21457db96d56Sopenharmony_ciobjects are created implicitly and these shortcut methods return the cursor
21467db96d56Sopenharmony_ciobjects. This way, you can execute a ``SELECT`` statement and iterate over it
21477db96d56Sopenharmony_cidirectly using only a single call on the :class:`Connection` object.
21487db96d56Sopenharmony_ci
21497db96d56Sopenharmony_ci.. testcode::
21507db96d56Sopenharmony_ci
21517db96d56Sopenharmony_ci   # Create and fill the table.
21527db96d56Sopenharmony_ci   con = sqlite3.connect(":memory:")
21537db96d56Sopenharmony_ci   con.execute("CREATE TABLE lang(name, first_appeared)")
21547db96d56Sopenharmony_ci   data = [
21557db96d56Sopenharmony_ci       ("C++", 1985),
21567db96d56Sopenharmony_ci       ("Objective-C", 1984),
21577db96d56Sopenharmony_ci   ]
21587db96d56Sopenharmony_ci   con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)
21597db96d56Sopenharmony_ci
21607db96d56Sopenharmony_ci   # Print the table contents
21617db96d56Sopenharmony_ci   for row in con.execute("SELECT name, first_appeared FROM lang"):
21627db96d56Sopenharmony_ci       print(row)
21637db96d56Sopenharmony_ci
21647db96d56Sopenharmony_ci   print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows")
21657db96d56Sopenharmony_ci
21667db96d56Sopenharmony_ci   # close() is not a shortcut method and it's not called automatically;
21677db96d56Sopenharmony_ci   # the connection object should be closed manually
21687db96d56Sopenharmony_ci   con.close()
21697db96d56Sopenharmony_ci
21707db96d56Sopenharmony_ci.. testoutput::
21717db96d56Sopenharmony_ci   :hide:
21727db96d56Sopenharmony_ci
21737db96d56Sopenharmony_ci   ('C++', 1985)
21747db96d56Sopenharmony_ci   ('Objective-C', 1984)
21757db96d56Sopenharmony_ci   I just deleted 2 rows
21767db96d56Sopenharmony_ci
21777db96d56Sopenharmony_ci
21787db96d56Sopenharmony_ci.. _sqlite3-connection-context-manager:
21797db96d56Sopenharmony_ci
21807db96d56Sopenharmony_ciHow to use the connection context manager
21817db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
21827db96d56Sopenharmony_ci
21837db96d56Sopenharmony_ciA :class:`Connection` object can be used as a context manager that
21847db96d56Sopenharmony_ciautomatically commits or rolls back open transactions when leaving the body of
21857db96d56Sopenharmony_cithe context manager.
21867db96d56Sopenharmony_ciIf the body of the :keyword:`with` statement finishes without exceptions,
21877db96d56Sopenharmony_cithe transaction is committed.
21887db96d56Sopenharmony_ciIf this commit fails,
21897db96d56Sopenharmony_cior if the body of the ``with`` statement raises an uncaught exception,
21907db96d56Sopenharmony_cithe transaction is rolled back.
21917db96d56Sopenharmony_ci
21927db96d56Sopenharmony_ciIf there is no open transaction upon leaving the body of the ``with`` statement,
21937db96d56Sopenharmony_cithe context manager is a no-op.
21947db96d56Sopenharmony_ci
21957db96d56Sopenharmony_ci.. note::
21967db96d56Sopenharmony_ci
21977db96d56Sopenharmony_ci   The context manager neither implicitly opens a new transaction
21987db96d56Sopenharmony_ci   nor closes the connection.
21997db96d56Sopenharmony_ci
22007db96d56Sopenharmony_ci.. testcode::
22017db96d56Sopenharmony_ci
22027db96d56Sopenharmony_ci   con = sqlite3.connect(":memory:")
22037db96d56Sopenharmony_ci   con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)")
22047db96d56Sopenharmony_ci
22057db96d56Sopenharmony_ci   # Successful, con.commit() is called automatically afterwards
22067db96d56Sopenharmony_ci   with con:
22077db96d56Sopenharmony_ci       con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
22087db96d56Sopenharmony_ci
22097db96d56Sopenharmony_ci   # con.rollback() is called after the with block finishes with an exception,
22107db96d56Sopenharmony_ci   # the exception is still raised and must be caught
22117db96d56Sopenharmony_ci   try:
22127db96d56Sopenharmony_ci       with con:
22137db96d56Sopenharmony_ci           con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
22147db96d56Sopenharmony_ci   except sqlite3.IntegrityError:
22157db96d56Sopenharmony_ci       print("couldn't add Python twice")
22167db96d56Sopenharmony_ci
22177db96d56Sopenharmony_ci   # Connection object used as context manager only commits or rollbacks transactions,
22187db96d56Sopenharmony_ci   # so the connection object should be closed manually
22197db96d56Sopenharmony_ci   con.close()
22207db96d56Sopenharmony_ci
22217db96d56Sopenharmony_ci.. testoutput::
22227db96d56Sopenharmony_ci   :hide:
22237db96d56Sopenharmony_ci
22247db96d56Sopenharmony_ci   couldn't add Python twice
22257db96d56Sopenharmony_ci
22267db96d56Sopenharmony_ci
22277db96d56Sopenharmony_ci.. _sqlite3-uri-tricks:
22287db96d56Sopenharmony_ci
22297db96d56Sopenharmony_ciHow to work with SQLite URIs
22307db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^
22317db96d56Sopenharmony_ci
22327db96d56Sopenharmony_ciSome useful URI tricks include:
22337db96d56Sopenharmony_ci
22347db96d56Sopenharmony_ci* Open a database in read-only mode:
22357db96d56Sopenharmony_ci
22367db96d56Sopenharmony_ci.. doctest::
22377db96d56Sopenharmony_ci
22387db96d56Sopenharmony_ci   >>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True)
22397db96d56Sopenharmony_ci   >>> con.execute("CREATE TABLE readonly(data)")
22407db96d56Sopenharmony_ci   Traceback (most recent call last):
22417db96d56Sopenharmony_ci   OperationalError: attempt to write a readonly database
22427db96d56Sopenharmony_ci
22437db96d56Sopenharmony_ci* Do not implicitly create a new database file if it does not already exist;
22447db96d56Sopenharmony_ci  will raise :exc:`~sqlite3.OperationalError` if unable to create a new file:
22457db96d56Sopenharmony_ci
22467db96d56Sopenharmony_ci.. doctest::
22477db96d56Sopenharmony_ci
22487db96d56Sopenharmony_ci   >>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
22497db96d56Sopenharmony_ci   Traceback (most recent call last):
22507db96d56Sopenharmony_ci   OperationalError: unable to open database file
22517db96d56Sopenharmony_ci
22527db96d56Sopenharmony_ci
22537db96d56Sopenharmony_ci* Create a shared named in-memory database:
22547db96d56Sopenharmony_ci
22557db96d56Sopenharmony_ci.. testcode::
22567db96d56Sopenharmony_ci
22577db96d56Sopenharmony_ci   db = "file:mem1?mode=memory&cache=shared"
22587db96d56Sopenharmony_ci   con1 = sqlite3.connect(db, uri=True)
22597db96d56Sopenharmony_ci   con2 = sqlite3.connect(db, uri=True)
22607db96d56Sopenharmony_ci   with con1:
22617db96d56Sopenharmony_ci       con1.execute("CREATE TABLE shared(data)")
22627db96d56Sopenharmony_ci       con1.execute("INSERT INTO shared VALUES(28)")
22637db96d56Sopenharmony_ci   res = con2.execute("SELECT data FROM shared")
22647db96d56Sopenharmony_ci   assert res.fetchone() == (28,)
22657db96d56Sopenharmony_ci
22667db96d56Sopenharmony_ci
22677db96d56Sopenharmony_ciMore information about this feature, including a list of parameters,
22687db96d56Sopenharmony_cican be found in the `SQLite URI documentation`_.
22697db96d56Sopenharmony_ci
22707db96d56Sopenharmony_ci.. _SQLite URI documentation: https://www.sqlite.org/uri.html
22717db96d56Sopenharmony_ci
22727db96d56Sopenharmony_ci
22737db96d56Sopenharmony_ci.. _sqlite3-howto-row-factory:
22747db96d56Sopenharmony_ci
22757db96d56Sopenharmony_ciHow to create and use row factories
22767db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
22777db96d56Sopenharmony_ci
22787db96d56Sopenharmony_ciBy default, :mod:`!sqlite3` represents each row as a :class:`tuple`.
22797db96d56Sopenharmony_ciIf a :class:`!tuple` does not suit your needs,
22807db96d56Sopenharmony_ciyou can use the :class:`sqlite3.Row` class
22817db96d56Sopenharmony_cior a custom :attr:`~Cursor.row_factory`.
22827db96d56Sopenharmony_ci
22837db96d56Sopenharmony_ciWhile :attr:`!row_factory` exists as an attribute both on the
22847db96d56Sopenharmony_ci:class:`Cursor` and the :class:`Connection`,
22857db96d56Sopenharmony_ciit is recommended to set :class:`Connection.row_factory`,
22867db96d56Sopenharmony_ciso all cursors created from the connection will use the same row factory.
22877db96d56Sopenharmony_ci
22887db96d56Sopenharmony_ci:class:`!Row` provides indexed and case-insensitive named access to columns,
22897db96d56Sopenharmony_ciwith minimal memory overhead and performance impact over a :class:`!tuple`.
22907db96d56Sopenharmony_ciTo use :class:`!Row` as a row factory,
22917db96d56Sopenharmony_ciassign it to the :attr:`!row_factory` attribute:
22927db96d56Sopenharmony_ci
22937db96d56Sopenharmony_ci.. doctest::
22947db96d56Sopenharmony_ci
22957db96d56Sopenharmony_ci   >>> con = sqlite3.connect(":memory:")
22967db96d56Sopenharmony_ci   >>> con.row_factory = sqlite3.Row
22977db96d56Sopenharmony_ci
22987db96d56Sopenharmony_ciQueries now return :class:`!Row` objects:
22997db96d56Sopenharmony_ci
23007db96d56Sopenharmony_ci.. doctest::
23017db96d56Sopenharmony_ci
23027db96d56Sopenharmony_ci   >>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius")
23037db96d56Sopenharmony_ci   >>> row = res.fetchone()
23047db96d56Sopenharmony_ci   >>> row.keys()
23057db96d56Sopenharmony_ci   ['name', 'radius']
23067db96d56Sopenharmony_ci   >>> row[0]         # Access by index.
23077db96d56Sopenharmony_ci   'Earth'
23087db96d56Sopenharmony_ci   >>> row["name"]    # Access by name.
23097db96d56Sopenharmony_ci   'Earth'
23107db96d56Sopenharmony_ci   >>> row["RADIUS"]  # Column names are case-insensitive.
23117db96d56Sopenharmony_ci   6378
23127db96d56Sopenharmony_ci
23137db96d56Sopenharmony_ciYou can create a custom :attr:`~Cursor.row_factory`
23147db96d56Sopenharmony_cithat returns each row as a :class:`dict`, with column names mapped to values:
23157db96d56Sopenharmony_ci
23167db96d56Sopenharmony_ci.. testcode::
23177db96d56Sopenharmony_ci
23187db96d56Sopenharmony_ci   def dict_factory(cursor, row):
23197db96d56Sopenharmony_ci       fields = [column[0] for column in cursor.description]
23207db96d56Sopenharmony_ci       return {key: value for key, value in zip(fields, row)}
23217db96d56Sopenharmony_ci
23227db96d56Sopenharmony_ciUsing it, queries now return a :class:`!dict` instead of a :class:`!tuple`:
23237db96d56Sopenharmony_ci
23247db96d56Sopenharmony_ci.. doctest::
23257db96d56Sopenharmony_ci
23267db96d56Sopenharmony_ci   >>> con = sqlite3.connect(":memory:")
23277db96d56Sopenharmony_ci   >>> con.row_factory = dict_factory
23287db96d56Sopenharmony_ci   >>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
23297db96d56Sopenharmony_ci   ...     print(row)
23307db96d56Sopenharmony_ci   {'a': 1, 'b': 2}
23317db96d56Sopenharmony_ci
23327db96d56Sopenharmony_ciThe following row factory returns a :term:`named tuple`:
23337db96d56Sopenharmony_ci
23347db96d56Sopenharmony_ci.. testcode::
23357db96d56Sopenharmony_ci
23367db96d56Sopenharmony_ci   from collections import namedtuple
23377db96d56Sopenharmony_ci
23387db96d56Sopenharmony_ci   def namedtuple_factory(cursor, row):
23397db96d56Sopenharmony_ci       fields = [column[0] for column in cursor.description]
23407db96d56Sopenharmony_ci       cls = namedtuple("Row", fields)
23417db96d56Sopenharmony_ci       return cls._make(row)
23427db96d56Sopenharmony_ci
23437db96d56Sopenharmony_ci:func:`!namedtuple_factory` can be used as follows:
23447db96d56Sopenharmony_ci
23457db96d56Sopenharmony_ci.. doctest::
23467db96d56Sopenharmony_ci
23477db96d56Sopenharmony_ci   >>> con = sqlite3.connect(":memory:")
23487db96d56Sopenharmony_ci   >>> con.row_factory = namedtuple_factory
23497db96d56Sopenharmony_ci   >>> cur = con.execute("SELECT 1 AS a, 2 AS b")
23507db96d56Sopenharmony_ci   >>> row = cur.fetchone()
23517db96d56Sopenharmony_ci   >>> row
23527db96d56Sopenharmony_ci   Row(a=1, b=2)
23537db96d56Sopenharmony_ci   >>> row[0]  # Indexed access.
23547db96d56Sopenharmony_ci   1
23557db96d56Sopenharmony_ci   >>> row.b   # Attribute access.
23567db96d56Sopenharmony_ci   2
23577db96d56Sopenharmony_ci
23587db96d56Sopenharmony_ciWith some adjustments, the above recipe can be adapted to use a
23597db96d56Sopenharmony_ci:class:`~dataclasses.dataclass`, or any other custom class,
23607db96d56Sopenharmony_ciinstead of a :class:`~collections.namedtuple`.
23617db96d56Sopenharmony_ci
23627db96d56Sopenharmony_ci
23637db96d56Sopenharmony_ci.. _sqlite3-explanation:
23647db96d56Sopenharmony_ci
23657db96d56Sopenharmony_ciExplanation
23667db96d56Sopenharmony_ci-----------
23677db96d56Sopenharmony_ci
23687db96d56Sopenharmony_ci.. _sqlite3-controlling-transactions:
23697db96d56Sopenharmony_ci
23707db96d56Sopenharmony_ciTransaction control
23717db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^
23727db96d56Sopenharmony_ci
23737db96d56Sopenharmony_ciThe :mod:`!sqlite3` module does not adhere to the transaction handling recommended
23747db96d56Sopenharmony_ciby :pep:`249`.
23757db96d56Sopenharmony_ci
23767db96d56Sopenharmony_ciIf the connection attribute :attr:`~Connection.isolation_level`
23777db96d56Sopenharmony_ciis not ``None``,
23787db96d56Sopenharmony_cinew transactions are implicitly opened before
23797db96d56Sopenharmony_ci:meth:`~Cursor.execute` and :meth:`~Cursor.executemany` executes
23807db96d56Sopenharmony_ci``INSERT``, ``UPDATE``, ``DELETE``, or ``REPLACE`` statements;
23817db96d56Sopenharmony_cifor other statements, no implicit transaction handling is performed.
23827db96d56Sopenharmony_ciUse the :meth:`~Connection.commit` and :meth:`~Connection.rollback` methods
23837db96d56Sopenharmony_cito respectively commit and roll back pending transactions.
23847db96d56Sopenharmony_ciYou can choose the underlying `SQLite transaction behaviour`_ —
23857db96d56Sopenharmony_cithat is, whether and what type of ``BEGIN`` statements :mod:`!sqlite3`
23867db96d56Sopenharmony_ciimplicitly executes –
23877db96d56Sopenharmony_civia the :attr:`~Connection.isolation_level` attribute.
23887db96d56Sopenharmony_ci
23897db96d56Sopenharmony_ciIf :attr:`~Connection.isolation_level` is set to ``None``,
23907db96d56Sopenharmony_cino transactions are implicitly opened at all.
23917db96d56Sopenharmony_ciThis leaves the underlying SQLite library in `autocommit mode`_,
23927db96d56Sopenharmony_cibut also allows the user to perform their own transaction handling
23937db96d56Sopenharmony_ciusing explicit SQL statements.
23947db96d56Sopenharmony_ciThe underlying SQLite library autocommit mode can be queried using the
23957db96d56Sopenharmony_ci:attr:`~Connection.in_transaction` attribute.
23967db96d56Sopenharmony_ci
23977db96d56Sopenharmony_ciThe :meth:`~Cursor.executescript` method implicitly commits
23987db96d56Sopenharmony_ciany pending transaction before execution of the given SQL script,
23997db96d56Sopenharmony_ciregardless of the value of :attr:`~Connection.isolation_level`.
24007db96d56Sopenharmony_ci
24017db96d56Sopenharmony_ci.. versionchanged:: 3.6
24027db96d56Sopenharmony_ci   :mod:`!sqlite3` used to implicitly commit an open transaction before DDL
24037db96d56Sopenharmony_ci   statements.  This is no longer the case.
24047db96d56Sopenharmony_ci
24057db96d56Sopenharmony_ci.. _autocommit mode:
24067db96d56Sopenharmony_ci   https://www.sqlite.org/lang_transaction.html#implicit_versus_explicit_transactions
24077db96d56Sopenharmony_ci
24087db96d56Sopenharmony_ci.. _SQLite transaction behaviour:
24097db96d56Sopenharmony_ci   https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions
2410