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