sqlite3 — DB-API 2.0 interfaz para bases de datos SQLite¶
Código fuente: Lib/sqlite3/
SQLite es una biblioteca de C que provee una base de datos ligera basada en disco que no requiere un proceso de servidor separado y permite acceder a la base de datos usando una variación no estándar del lenguaje de consulta SQL. Algunas aplicaciones pueden usar SQLite para almacenamiento interno. También es posible prototipar una aplicación usando SQLite y luego transferir el código a una base de datos más grande como PostgreSQL u Oracle.
El módulo sqlite3 fue escrito por Gerhard Häring. Proporciona una interfaz SQL compatible con la especificación DB-API 2.0 descrita por PEP 249 y requiere SQLite 3.15.2 o una versión más reciente.
Esta documentación contiene cuatro secciones principales:
Tutorial enseña como usar el módulo
sqlite3module.Referencia describe las clases y funciones que se definen en este módulo.
Guías prácticas detalla como manipular tareas específicas.
Explicación proporciona en profundidad información sobre el control transaccional.
Ver también
- https://www.sqlite.org
La página web SQLite; la documentación describe la sintaxis y los tipos de datos disponibles para el lenguaje SQL soportado.
- https://www.w3schools.com/sql/
Tutorial, referencia y ejemplos para aprender sintaxis SQL.
- PEP 249 - Especificación de la API 2.0 de base de datos
PEP escrito por Marc-André Lemburg.
Tutorial¶
En este tutorial, será creada una base de datos de películas Monty Python usando funcionalidades básicas de sqlite3. Se asume un entendimiento fundamental de conceptos de bases de dados, como cursors y transactions.
Primero, necesitamos crear una nueva base de datos y abrir una conexión de base de datos para permitir que sqlite3 trabaje con ella. Llamamos a sqlite3.connect() para crear una conexión a la base de datos tutorial.db en el directorio de trabajo actual, creándola implícitamente si no existe:
import sqlite3
con = sqlite3.connect("tutorial.db")
El retorno será un objecto de la clase Connection representado en con como una base de datos local.
Con el fin de ejecutar sentencias SQL y obtener resultados de consultas SQL, necesitaremos usar un cursor para la base de datos. Llamando con.cursor() se creará el Cursor:
cur = con.cursor()
Ahora que hemos configurado una conexión y un cursor, podemos crear una tabla movie con las columnas title, release year, y review score. Para simplificar, podemos solamente usar nombres de columnas en la declaración de la tabla – gracias al recurso de flexible typing SQLite, especificar los tipos de datos es opcional. Ejecuta la sentencia CREATE TABLE llamando cur.execute(...):
cur.execute("CREATE TABLE movie(title, year, score)")
Podemos verificar que una nueva tabla ha sido creada consultando la tabla sqlite_master incorporada en SQLite, la cual ahora debería contener una entrada para la tabla movie (consulte The Schema Table para más información). Ejecute esa consulta llamando a cur.execute(...), asigne el resultado a res y llame a res.fetchone() para obtener la fila resultante:
>>> res = cur.execute("SELECT name FROM sqlite_master")
>>> res.fetchone()
('movie',)
Podemos ver que la tabla ha sido creada, ya que la consulta devuelve un tuple que contiene el nombre de la tabla. Si consultamos sqlite_master para una tabla inexistente spam, res.fetchone() devolverá None:
>>> res = cur.execute("SELECT name FROM sqlite_master WHERE name='spam'")
>>> res.fetchone() is None
True
Ahora, agrega dos filas de datos proporcionados como SQL literales, ejecutando la sentencia INSERT, una vez más llamando a cur.execute(...):
cur.execute("""
INSERT INTO movie VALUES
('Monty Python and the Holy Grail', 1975, 8.2),
('And Now for Something Completely Different', 1971, 7.5)
""")
La sentencia INSERT implícitamente abre una transacción, la cual necesita ser confirmada antes que los cambios sean guardados en la base de datos (consulte Control transaccional para más información). Llamando a con.commit() sobre el objeto de la conexión, se confirmará la transacción:
con.commit()
Podemos verificar que la información fue introducida correctamente ejecutando la consulta SELECT. Ejecute el ahora conocido cur.execute(...) para asignar el resultado a res, y luego llame a res.fetchall() para obtener todas las filas como resultado:
>>> res = cur.execute("SELECT score FROM movie")
>>> res.fetchall()
[(8.2,), (7.5,)]
El resultado es una list de dos tuples, una por fila, cada una conteniendo el valor del score de esa fila.
Ahora, introduzca tres filas más llamando cur.executemany(...):
data = [
("Monty Python Live at the Hollywood Bowl", 1982, 7.9),
("Monty Python's The Meaning of Life", 1983, 7.5),
("Monty Python's Life of Brian", 1979, 8.0),
]
cur.executemany("INSERT INTO movie VALUES(?, ?, ?)", data)
con.commit() # Remember to commit the transaction after executing INSERT.
Note que los marcadores de posición ? son usados para enlazar data a la consulta. SIempre use marcadores de posición en lugar de string formatting para unir valores Python a sentencias SQL, y así evitará SQL injection attacks (consulte Cómo usar marcadores de posición para vincular valores en consultas SQL para más información).
Podemos verificar que las nuevas filas fueron introducidas ejecutando una consulta SELECT, esta vez iterando sobre los resultados de la consulta:
>>> for row in cur.execute("SELECT year, title FROM movie ORDER BY year"):
... print(row)
(1971, 'And Now for Something Completely Different')
(1975, 'Monty Python and the Holy Grail')
(1979, "Monty Python's Life of Brian")
(1982, 'Monty Python Live at the Hollywood Bowl')
(1983, "Monty Python's The Meaning of Life")
Cada fila es una tuple de dos items con (year, title), donde las columnas seleccionadas coinciden con la consulta.
Finalmente, se puede verificar que la base de datos ha sido escrita en disco, llamando con.close() para cerrar la conexión existente, abriendo una nueva, creando un nuevo cursor y luego consultando la base de datos:
>>> con.close()
>>> new_con = sqlite3.connect("tutorial.db")
>>> new_cur = new_con.cursor()
>>> res = new_cur.execute("SELECT title, year FROM movie ORDER BY score DESC")
>>> title, year = res.fetchone()
>>> print(f'The highest scoring Monty Python movie is {title!r}, released in {year}')
The highest scoring Monty Python movie is 'Monty Python and the Holy Grail', released in 1975
>>> new_con.close()
Ahora ha creado una base de datos SQLite usando el módulo sqlite3, insertado datos y recuperado valores de varias maneras.
Ver también
Guías prácticas para lecturas de interés:
Explicación para obtener información detallada sobre el control de transacciones..
Referencia¶
Funciones del módulo¶
- sqlite3.connect(database, timeout=5.0, detect_types=0, isolation_level='DEFERRED', check_same_thread=True, factory=sqlite3.Connection, cached_statements=128, uri=False, *, autocommit=sqlite3.LEGACY_TRANSACTION_CONTROL)¶
Abre una conexión con una base de datos SQLite.
- Parámetros:
database (path-like object) – La ruta al archivo de base de datos que se va a abrir. Puede pasar
":memory:"para crear un SQLite database existing only in memory y abrir una conexión con él.timeout (float) – Cuántos segundos debe esperar la conexión antes de generar un
OperationalErrorcuando una tabla está bloqueada. Si otra conexión abre una transacción para modificar una tabla, esa tabla se bloqueará hasta que se confirme la transacción. El valor predeterminado es cinco segundos.detect_types (int) – Control whether and how data types not natively supported by SQLite are looked up to be converted to Python types, using the converters registered with
register_converter(). Set it to any combination (using|, bitwise or) ofPARSE_DECLTYPESandPARSE_COLNAMESto enable this. Column names takes precedence over declared types if both flags are set. By default (0), type detection is disabled.isolation_level (str | None) – Controla el comportamiento de manejo de transacciones heredadas. Consulta
Connection.isolation_levely Control de transacciones mediante el atributo isolation_level para obtener más información. Puede ser"DEFERRED"(predeterminado),"EXCLUSIVE"o"IMMEDIATE"; oNonepara deshabilitar la apertura de transacciones de manera implícita. No tiene efecto a menos queConnection.autocommitse configure enLEGACY_TRANSACTION_CONTROL(predeterminado).check_same_thread (bool) – Si es
True(predeterminado), se generaráProgrammingErrorsi la conexión de la base de datos la utiliza un subproceso distinto del que la creó. Si esFalse, se puede acceder a la conexión en varios subprocesos; es posible que el usuario deba serializar las operaciones de escritura para evitar la corrupción de datos. Consultethreadsafetypara obtener más información.factory (Connection) – Una subclase personalizada de
Connectioncon la que crear la conexión, sino laConnectionserá la predeterminada.cached_statements (int) – El número de instrucciones que
sqlite3debe almacenar internamente en caché para esta conexión, para evitar la sobrecarga de análisis. El valor predeterminada, son 128 instrucciones.uri (bool) – Si se establece en
True, database es interpretada como una URI con la ruta de un archivo y una consulta de cadena de caracteres de modo opcional. La parte del esquema debe ser"file:", y la ruta puede ser relativa o absoluta. La consulta permite pasar parámetros a SQLite, habilitando varias Como trabajar con URIs SQLite.autocommit (bool) – Controla el comportamiento de manejo de transacciones de PEP 249. Consulta
Connection.autocommity Control de transacciones mediante el atributo autocommit para obtener más información. autocommit tiene como valor predeterminadoLEGACY_TRANSACTION_CONTROL. El valor predeterminado cambiará aFalseen una futura versión de Python.
- Tipo del valor devuelto:
Lanza un auditing event
sqlite3.connectcon el argumentodatabase.Lanza un auditing event
sqlite3.connect/handlecon el argumentoconnection_handle.Distinto en la versión 3.4: Se agregó el parámetro uri.
Distinto en la versión 3.7: database ahora también puede ser un path-like object, no solo una cadena de caracteres.
Distinto en la versión 3.10: Se agregó el evento de auditoría
sqlite3.connect/handle.Distinto en la versión 3.12: Se agregó el parámetro autocommit.
Distinto en la versión 3.13: El uso posicional de los parámetros timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements y uri está obsoleto. Se convertirán en parámetros de solo palabras clave en Python 3.15.
- sqlite3.complete_statement(statement)¶
Retorna
Truesi la cadena de caracteres statement pareciera contener uno o más sentencias SQL completas. No se realiza ninguna verificación o análisis sintáctico de ningún tipo, aparte de comprobar que no hay cadena de caracteres literales sin cerrar y que la sentencia se termine con un punto y coma.Por ejemplo:
>>> sqlite3.complete_statement("SELECT foo FROM bar;") True >>> sqlite3.complete_statement("SELECT foo") False
Esta función puede ser útil con entradas de línea de comando para determinar si los textos introducidos parecen formar una sentencia completa SQL, o si una entrada adicional se necesita antes de llamar a
execute().Consulte
runsource()en Lib/sqlite3/__main__.py para uso en el mundo real.
- sqlite3.enable_callback_tracebacks(flag, /)¶
Habilita o deshabilita seguimiento de retrollamadas. Por defecto no se obtendrá ningún tracebacks en funciones aggregates, converters, autorizador de callbacks etc, definidas por el usuario. Si quieres depurarlas, se puede llamar esta función con flag establecida como
True. Después se obtendrán tracebacks de los callbacks ensys.stderr. UsarFalsepara deshabilitar la característica de nuevo.Nota
Los errores en las devoluciones de llamadas de funciones definidas por el usuario se registran como excepciones que no se pueden generar. Utilice un
unraisable hook handlerpara la introspección de la devolución de llamada fallida.
- sqlite3.register_adapter(type, adapter, /)¶
Registre un adapter callable para adaptar el tipo Python type a un tipo SQLite. El adaptador se llama con un objeto Python de tipo type como único argumento y debe devolver un valor type that SQLite natively understands.
- sqlite3.register_converter(typename, converter, /)¶
Registre converter callable para convertir objetos SQLite de tipo typename en un objeto Python de un tipo específico. El convertidor se invoca para todos los valores SQLite de tipo typename; se le pasa un objeto
bytesy debe devolver un objeto del tipo Python deseado. Consulte el parámetro detect_types deconnect()para obtener información sobre cómo funciona la detección de tipos.Nota: typename y el nombre del tipo en tu consulta coinciden sin distinción entre mayúsculas y minúsculas.
Constantes del módulo¶
- sqlite3.LEGACY_TRANSACTION_CONTROL¶
Establezca
autocommiten esta constante para seleccionar el comportamiento de control de transacciones de estilo antiguo (anterior a Python 3.12). Consulte Control de transacciones mediante el atributo isolation_level para obtener más información.
- sqlite3.PARSE_DECLTYPES¶
Pasa este valor de flag como parámetro detect_types de la
connect()para buscar una función converter usando los tipos declarados para cada columna. Los tipos son declarados cuando la tabla de la base de datos se creó.sqlite3buscará una función converter usando la primera palabra del tipo declarado como la llave del diccionario conversor. Por ejemplo:CREATE TABLE test( i integer primary key, ! will look up a converter named "integer" p point, ! will look up a converter named "point" n number(10) ! will look up a converter named "number" )
Esta puede ser combinada con
PARSE_COLNAMESusando el operador|(bitwise or).Nota
Generated fields (for example
MAX(p)) are returned asstr. UsePARSE_COLNAMESto enforce types for such queries.
- sqlite3.PARSE_COLNAMES¶
Pass this flag value to the detect_types parameter of
connect()to look up a converter function by using the type name, parsed from the query column name, as the converter dictionary key. The query column name must be wrapped in double quotes (") and the type name must be wrapped in square brackets ([]).SELECT MAX(p) as "p [point]" FROM test; ! will look up converter "point"
Esta flag puede ser combinada con
PARSE_DECLTYPESusando el operador|(bitwise or) .
- sqlite3.SQLITE_OK¶
- sqlite3.SQLITE_DENY¶
- sqlite3.SQLITE_IGNORE¶
Banderas que debe devolver el authorizer_callback que callable pasa a
Connection.set_authorizer(), para indicar si:Acceso es permitido (
SQLITE_OK),La sentencia SQL debería ser abortada con un error (
SQLITE_DENY)La columna debería ser tratada como un valor
NULL(SQLITE_IGNORE)
- sqlite3.apilevel¶
Cadena de caracteres constante que indica el nivel DB-API soportado. Requerido por DB-API. Codificado de forma rígida en
"2.0".
- sqlite3.paramstyle¶
Cadena de caracteres que indica el tipo de formato del marcador de parámetros esperado por el módulo
sqlite3. Requerido por DB-API. Codificado de forma rígida en"qmark".Nota
También se admite el estilo de parámetro
namedDB-API.
- sqlite3.sqlite_version¶
El número de versión de la librería SQLite en tiempo de ejecución, como una
cadena de caracteres.
- sqlite3.sqlite_version_info¶
El número de versión de la librería SQLite en tiempo de ejecución, como una
tupladeenteros.
- sqlite3.threadsafety¶
Constante de tipo entero requerida por la DB-API 2.0, la cual indica el nivel de seguridad de subproceso que
sqlite3soporta. Este atributo se establece basándose en el modo de subprocesamiento por defecto con el que la biblioteca SQLite se compila. Los modos de subprocesamiento de SQLite son:Single-thread: En este modo, todos los mutexes son deshabilitados y no es seguro usar SQLite en más de un solo hilo a la vez.
Multi-thread: En este modo, es seguro usar SQLite desde varios hilos dado que que ninguna conexión de base de datos sea usada simultáneamente en dos o más hilos.
Serialized: En el modo serializado, es seguro usar SQLite por varios hilos sin restricción.
Las asignaciones de los modos de subprocesos SQLite a los niveles de seguridad de subprocesos de DB-API 2.0 son las siguientes:
Modo de subprocesamiento SQLite
Significado de DB-API 2.0
single-thread
0
0
Hilos no pueden compartir el módulo
multi-thread
1
2
Hilos pueden compartir el módulo, pero no conexiones
serialized
3
1
Hilos pueden compartir el módulo, conexiones y cursores
Distinto en la versión 3.11: Establece threadsafety dinámicamente en vez de codificarlo rígidamente a
1.
- sqlite3.version¶
El número de versión de este módulo, como una
cadena de caracteres. Este no es la versión de la librería SQLite.Deprecated since version 3.12, will be removed in version 3.14: Esta constante solía reflejar el número de versión del paquete
pysqlite, una biblioteca de terceros que solía incluir cambios ensqlite3. Hoy en día, no tiene significado ni valor práctico.
- sqlite3.version_info¶
El número de versión de este módulo, como una
tupladeenteros. Este no es la versión de la librería SQLite.Deprecated since version 3.12, will be removed in version 3.14: Esta constante solía reflejar el número de versión del paquete
pysqlite, una biblioteca de terceros que solía incluir cambios ensqlite3. Hoy en día, no tiene significado ni valor práctico.
- sqlite3.SQLITE_DBCONFIG_DEFENSIVE¶
- sqlite3.SQLITE_DBCONFIG_DQS_DDL¶
- sqlite3.SQLITE_DBCONFIG_DQS_DML¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_FKEY¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_QPSG¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_TRIGGER¶
- sqlite3.SQLITE_DBCONFIG_ENABLE_VIEW¶
- sqlite3.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE¶
- sqlite3.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT¶
- sqlite3.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE¶
- sqlite3.SQLITE_DBCONFIG_RESET_DATABASE¶
- sqlite3.SQLITE_DBCONFIG_TRIGGER_EQP¶
- sqlite3.SQLITE_DBCONFIG_TRUSTED_SCHEMA¶
- sqlite3.SQLITE_DBCONFIG_WRITABLE_SCHEMA¶
Estas constantes se utilizan para los métodos
Connection.setconfig()ygetconfig().La disponibilidad de estas constantes varía según la versión de SQLite con la que se compiló Python.
Added in version 3.12.
Ver también
- https://www.sqlite.org/c3ref/c_dbconfig_defensive.html
Documentación de SQLite: Opciones de configuración de la conexión a la base de datos
Objetos de conexión¶
- class sqlite3.Connection¶
Cada base de datos SQLite abierta es representada por un objeto
Connection, el cual se crea usandosqlite3.connect(). Su objetivo principal es crear objetosCursor, y Control transaccional.Ver también
Distinto en la versión 3.13: Se emite un
ResourceWarningsi no se llama aclose()antes de eliminar un objetoConnection.Una conexión a una base de datos SQLite tiene los siguientes atributos y métodos:
- cursor(factory=Cursor)¶
Crea y devuelve un objeto
Cursor. El método del cursor acepta un único parámetro opcional, factory. Si se proporciona, debe ser un callable que devuelva una instancia deCursoro sus subclases.
- blobopen(table, column, rowid, /, *, readonly=False, name='main')¶
Abre una
Blobpara manejar un BLOB existente.- Parámetros:
table (str) – El nombre de la tabla donde el blob está ubicado.
column (str) – El nombre de la columna donde el blob está ubicado.
rowid (int) – The row id where the blob is located.
readonly (bool) – Se define como
Truesi el blob deberá ser abierto sin permisos de escritura. El valor por defecto esFalse.name (str) – El nombre de la base de datos donde el blob está ubicado. El valor por defecto es
"main".
- Muestra:
OperationalError – Cuando se intenta abrir un blob en una tabla
WITHOUT ROWID.- Tipo del valor devuelto:
Nota
El tamaño de un blob no puede ser cambiado usando la clase
Blob. Usa la función de SQLzeroblobpara crear un blob con un tamaño fijo.Added in version 3.11.
- commit()¶
Confirma cualquier transacción pendiente en la base de datos. Si
autocommitesTrueo no hay ninguna transacción abierta, este método no hace nada. SiautocommitesFalse, se abre implícitamente una nueva transacción si se confirmó una transacción pendiente con este método.
- rollback()¶
Revertir al inicio de cualquier transacción pendiente. Si
autocommitesTrueo no hay ninguna transacción abierta, este método no hace nada. SiautocommitesFalse, se abre implícitamente una nueva transacción si se revirtió una transacción pendiente con este método.
- close()¶
Cierre la conexión a la base de datos. Si
autocommitesFalse, cualquier transacción pendiente se revierte implícitamente. SiautocommitesTrueoLEGACY_TRANSACTION_CONTROL, no se ejecuta ningún control de transacción implícito. Asegúrese de ejecutarcommit()antes de cerrar para evitar perder los cambios pendientes.
- execute(sql, parameters=(), /)¶
Crea un nuevo objeto
Cursory llamaexecute()con los parámetros y el SQL dados. Retorna el nuevo objeto cursor.
- executemany(sql, parameters, /)¶
Crea una nueva
Cursorobject and callexecutemany()con los parámetros y el SQL dados. Retorna el nuevo objeto cursor.
- executescript(sql_script, /)¶
Crea una nueva
Cursorobject and callexecutescript()con el sql_script dado. Retorna el nuevo objeto cursor.
- create_function(name, narg, func, *, deterministic=False)¶
Crea o elimina una función SQL definida por el usuario.
- Parámetros:
name (str) – El nombre de la función SQL.
narg (int) – El número de argumentos que la función SQL puede aceptar. Si es
-1, podrá entonces recibir cualquier cantidad de argumentos.func (callback | None) – Un callable que se llama cuando se invoca la función SQL. El invocable debe devolver a type natively supported by SQLite. Establézcalo en
Nonepara eliminar una función SQL existente.deterministic (bool) – Si se establece
True, la función SQL creada se marcará como determinista, lo cual permite a SQLite realizar optimizaciones adicionales.
Distinto en la versión 3.8: Se agregó el parámetro deterministic.
Ejemplo:
>>> import hashlib >>> def md5sum(t): ... return hashlib.md5(t).hexdigest() >>> con = sqlite3.connect(":memory:") >>> con.create_function("md5", 1, md5sum) >>> for row in con.execute("SELECT md5(?)", (b"foo",)): ... print(row) ('acbd18db4cc2f85cedef654fccc4a4d8',) >>> con.close()
Distinto en la versión 3.13: El uso de name, narg y func como argumentos de palabras clave ya no es recomendable. Estos parámetros pasarán a ser solo posicionales en Python 3.15.
- create_aggregate(name, n_arg, aggregate_class)¶
Crea o elimina una función agregada SQL definida por el usuario.
- Parámetros:
name (str) – El nombre de la función agregada SQL.
n_arg (int) – El número de argumentos que la función agregada SQL puede aceptar. Si es
-1, podrá entonces recibir cualquier cantidad de argumentos.aggregate_class (class | None) – Una clase debe implementar los siguientes métodos: *
step(): Adiciona una fila al aggregate. *finalize(): Retorna el resultado final del aggregate como un tipo soportado nativamente por SQLite. La cantidad de argumentos que el métodostep()puede aceptar, es controlado por n_arg. EstableceNonepara eliminar una función agregada SQL existente.
Ejemplo:
class MySum: def __init__(self): self.count = 0 def step(self, value): self.count += value def finalize(self): return self.count con = sqlite3.connect(":memory:") con.create_aggregate("mysum", 1, MySum) cur = con.execute("CREATE TABLE test(i)") cur.execute("INSERT INTO test(i) VALUES(1)") cur.execute("INSERT INTO test(i) VALUES(2)") cur.execute("SELECT mysum(i) FROM test") print(cur.fetchone()[0]) con.close()
Distinto en la versión 3.13: El uso de name, n_arg y aggregate_class como argumentos de palabras clave ya no es recomendable. Estos parámetros pasarán a ser solo posicionales en Python 3.15.
- create_window_function(name, num_params, aggregate_class, /)¶
Crea o elimina una función agregada de ventana definida por el usuario.
- Parámetros:
name (str) – El nombre de la función agregada de ventana a ser creada o eliminada.
num_params (int) – La cantidad de argumentos que la función agregada de ventana SQL acepta. Si es
-1, podrá entonces recibir cualquier cantidad de argumentos.aggregate_class (class | None) – Una clase debe implementar los siguientes métodos: *
step(): Agrega una fila a la ventana actual. *value(): Retorna el valor actual del aggregate . *inverse(): Elimina una fila de la ventana actual. *finalize(): Retorna el resultado final del aggregate como una un tipo soportado nativamente por SQLite. La cantidad de argumentos que los métodosstep()yvalue()pueden aceptar son controlados por num_params. EstableceNonepara eliminar una función agregada de ventana SQL.
- Muestra:
NotSupportedError – Si es usado con una versión de SQLite inferior a 3.25.0, la cual no soporte funciones agregadas de ventana.
Added in version 3.11.
Ejemplo:
# Example taken from https://www.sqlite.org/windowfunctions.html#udfwinfunc class WindowSumInt: def __init__(self): self.count = 0 def step(self, value): """Add a row to the current window.""" self.count += value def value(self): """Return the current value of the aggregate.""" return self.count def inverse(self, value): """Remove a row from the current window.""" self.count -= value def finalize(self): """Return the final value of the aggregate. Any clean-up actions should be placed here. """ return self.count con = sqlite3.connect(":memory:") cur = con.execute("CREATE TABLE test(x, y)") values = [ ("a", 4), ("b", 5), ("c", 3), ("d", 8), ("e", 1), ] cur.executemany("INSERT INTO test VALUES(?, ?)", values) con.create_window_function("sumint", 1, WindowSumInt) cur.execute(""" SELECT x, sumint(y) OVER ( ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) AS sum_y FROM test ORDER BY x """) print(cur.fetchall()) con.close()
- create_collation(name, callable, /)¶
Crea una colación nombrada name usando la función collating callable. A callable se le pasan dos argumentos
string, y este debería retornar unentero:1si el primero es ordenado más alto que el segundo-1si el primero es ordenado más pequeño que el segundo0si están ordenados de manera igual
El siguiente ejemplo muestra una ordenación de colación inversa:
def collate_reverse(string1, string2): if string1 == string2: return 0 elif string1 < string2: return 1 else: return -1 con = sqlite3.connect(":memory:") con.create_collation("reverse", collate_reverse) cur = con.execute("CREATE TABLE test(x)") cur.executemany("INSERT INTO test(x) VALUES(?)", [("a",), ("b",)]) cur.execute("SELECT x FROM test ORDER BY x COLLATE reverse") for row in cur: print(row) con.close()
Elimina una función de colación al establecer el callable como
None.Distinto en la versión 3.11: El nombre de la colación puede contener cualquier caracter Unicode. Anteriormente, solamente caracteres ASCII eran permitidos.
- interrupt()¶
Llame a este método desde un subproceso diferente para cancelar cualquier consulta que pueda estar ejecutándose en la conexión. Las consultas canceladas generarán un error
OperationalError.
- set_authorizer(authorizer_callback)¶
Registre callable authorizer_callback para que se invoque cada vez que se intente acceder a una columna de una tabla en la base de datos. La devolución de llamada debe devolver uno de los siguientes:
SQLITE_OK,SQLITE_DENYoSQLITE_IGNOREpara indicar cómo debe gestionar la biblioteca SQLite subyacente el acceso a la columna.El primer argumento del callback significa que tipo de operación será autorizada. El segundo y tercer argumento serán argumentos o
Nonedependiendo del primer argumento. El cuarto argumento es el nombre de la base de datos («main», «temp», etc.) si aplica. El quinto argumento es el nombre del disparador más interno o vista que es responsable por los intentos de acceso oNonesi este intento de acceso es directo desde el código SQL de entrada.Por favor consulte la documentación de SQLite sobre los posibles valores para el primer argumento y el significado del segundo y tercer argumento dependiendo del primero. Todas las constantes necesarias están disponibles en el módulo
sqlite3.Pasando
Nonecomo authorizer_callback deshabilitará el autorizador.Distinto en la versión 3.11: Agregado soporte para deshabilitar el autorizador usando
None.Distinto en la versión 3.13: El uso de authorizer_callback como argumento de palabra clave ya no es recomendable. El parámetro pasará a ser solo posicional en Python 3.15.
- set_progress_handler(progress_handler, n)¶
Registre callable progress_handler para que se invoque para cada instrucción n de la máquina virtual SQLite. Esto es útil si desea recibir llamadas de SQLite durante operaciones de larga duración, por ejemplo, para actualizar una GUI.
Si se desea limpiar cualquier progress_handler instalado anteriormente, llame el método con
Nonepara progress_handler.Si se devuelve un valor distinto de cero desde la función del controlador, se finalizará la consulta que se está ejecutando actualmente y se generará una excepción
DatabaseError.Distinto en la versión 3.13: El uso de progress_handler como argumento de palabra clave ya no es recomendable. El parámetro pasará a ser solo posicional en Python 3.15.
- set_trace_callback(trace_callback)¶
Registre callable trace_callback para que se invoque para cada declaración SQL que realmente ejecute el backend de SQLite.
El único argumento pasado a la retrollamada es la declaración (como
str) que se está ejecutando. El valor de retorno de la retrollamada es ignorado. Tenga en cuenta que el backend no solo ejecuta declaraciones pasadas a los métodosCursor.execute(). Otras fuentes incluyen el transaction management del módulosqlite3y la ejecución de disparadores definidos en la base de datos actual.Pasando
Nonecomo trace_callback deshabilitará el trace callback.Nota
Las excepciones que se producen en la llamada de retorno no se propagan. Como ayuda para el desarrollo y la depuración, utilice
enable_callback_tracebacks()para habilitar la impresión de tracebacks de las excepciones que se producen en la llamada de retorno.Added in version 3.3.
Distinto en la versión 3.13: El uso de trace_callback como argumento de palabra clave ya no es recomendable. El parámetro pasará a ser solo posicional en Python 3.15.
- enable_load_extension(enabled, /)¶
Habilita el motor de SQLite para cargar extensiones SQLite de bibliotecas compartidas si enabled se establece como
True; sino deshabilitará la carga de extensiones SQLite. Las extensiones SQLite pueden definir implementaciones de nuevas funciones, agregaciones, o tablas virtuales enteras. Una extensión bien conocida es fulltext-search distribuida con SQLite.Nota
El módulo
sqlite3no está construido con soporte de extensión cargable de forma predeterminada, porque algunas plataformas (especialmente macOS) tienen bibliotecas SQLite que se compilan sin esta función. Para obtener soporte para extensiones cargables, debe pasar la opción--enable-loadable-sqlite-extensionsa configure.Lanza un auditing event
sqlite3.enable_load_extensioncon los argumentosconnection,enabled.Added in version 3.2.
Distinto en la versión 3.10: Agregado el evento de auditoría
sqlite3.enable_load_extension.con.enable_load_extension(True) # Load the fulltext search extension con.execute("select load_extension('./fts3.so')") # alternatively you can load the extension using an API call: # con.load_extension("./fts3.so") # disable extension loading again con.enable_load_extension(False) # example from SQLite wiki con.execute("CREATE VIRTUAL TABLE recipe USING fts3(name, ingredients)") con.executescript(""" INSERT INTO recipe (name, ingredients) VALUES('broccoli stew', 'broccoli peppers cheese tomatoes'); INSERT INTO recipe (name, ingredients) VALUES('pumpkin stew', 'pumpkin onions garlic celery'); INSERT INTO recipe (name, ingredients) VALUES('broccoli pie', 'broccoli cheese onions flour'); INSERT INTO recipe (name, ingredients) VALUES('pumpkin pie', 'pumpkin sugar flour butter'); """) for row in con.execute("SELECT rowid, name, ingredients FROM recipe WHERE name MATCH 'pie'"): print(row)
- load_extension(path, /, *, entrypoint=None)¶
Cargue una extensión SQLite desde una biblioteca compartida. Habilite la carga de extensiones con
enable_load_extension()antes de llamar a este método.- Parámetros:
path (str) – La ruta a la extensión SQLite.
entrypoint (str | None) – Nombre del punto de entrada. Si es
None(el valor predeterminado), SQLite creará un nombre de punto de entrada propio; consulte la documentación de SQLite Loading an Extension para obtener más detalles.
Lanza un auditing event
sqlite3.load_extensioncon argumentosconnection,path.Added in version 3.2.
Distinto en la versión 3.10: Agregado el evento de auditoría
sqlite3.load_extension.Distinto en la versión 3.12: Se agregó el parámetro entrypoint.
- iterdump(*, filter=None)¶
Retorna un iterator para volcar la base de datos en un texto de formato SQL. Es útil cuando guardamos una base de datos en memoria para una posterior restauración. Esta función provee las mismas capacidades que el comando
.dumpen el shell sqlite3.- Parámetros:
filter (str | None) – Un patrón
LIKEopcional para volcar objetos de la base de datos, p. ej.,prefix_%. Si se usaNone(el valor predeterminado), se incluirán todos los objetos de la base de datos.
Ejemplo:
# Convert file example.db to SQL dump file dump.sql con = sqlite3.connect('example.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) con.close()
Distinto en la versión 3.13: Se agregó el parámetro filter.
- backup(target, *, pages=-1, progress=None, name='main', sleep=0.250)¶
Crea una copia de seguridad de la base de datos SQLite.
Funciona incluso si la base de datos está siendo accedida por otros clientes al mismo tiempo sobre la misma conexión.
- Parámetros:
target (Connection) – La conexión de la base de datos para guardar la copia de seguridad.
pages (int) – Cantidad de páginas que serán copiadas cada vez. Si es menor o igual a
0, toda la base de datos será copiada en un solo paso. El valor por defecto es-1.progress (callback | None) – Si se configura en callable, se invoca con tres argumentos enteros para cada iteración de copia de seguridad: el status de la última iteración, el remaining número de páginas que aún se deben copiar y el total número de páginas. El valor predeterminado es
None.name (str) – El nombre de la base de datos a ser guardada. O bien sea
"main"(valor por defecto) para la base de datos main,"temp"para la base de datos temporal, o el nombre de una base de datos personalizada adjuntada usando la sentenciaATTACH DATABASE.sleep (float) – Número de segundos a dormir entre sucesivos intentos para respaldar páginas restantes.
Ejemplo 1, copiar una base de datos existente en otra:
def progress(status, remaining, total): print(f'Copied {total-remaining} of {total} pages...') src = sqlite3.connect('example.db') dst = sqlite3.connect('backup.db') with dst: src.backup(dst, pages=1, progress=progress) dst.close() src.close()
Ejemplo 2: copiar una base de datos existente en una copia transitoria:
src = sqlite3.connect('example.db') dst = sqlite3.connect(':memory:') src.backup(dst) dst.close() src.close()
Added in version 3.7.
- getlimit(category, /)¶
Obtiene el límite de tiempo de ejecución de una conexión.
- Parámetros:
category (int) – La SQLite limit category a ser consultada.
- Tipo del valor devuelto:
- Muestra:
ProgrammingError – Si category no se reconoce por las capas inferiores de la biblioteca SQLite.
Ejemplo, consulta el tamaño máximo de una sentencia SQL para la
Connectioncon(el valor por defecto es 1000000000):>>> con.getlimit(sqlite3.SQLITE_LIMIT_SQL_LENGTH) 1000000000
Added in version 3.11.
- setlimit(category, limit, /)¶
Establezca un límite de tiempo de ejecución de la conexión. Los intentos de aumentar un límite por encima de su límite superior estricto se truncan de forma silenciosa hasta el límite superior estricto. Independientemente de si se modificó o no el límite, se devuelve el valor anterior del límite.
- Parámetros:
category (int) – La SQLite limit category a ser establecido.
limit (int) – El valor del nuevo límite. Si es negativo, el límite actual no cambia.
- Tipo del valor devuelto:
- Muestra:
ProgrammingError – Si category no se reconoce por las capas inferiores de la biblioteca SQLite.
Por ejemplo, limite el número de bases de datos adjuntas a 1 para la
Connectioncon(el valor por defecto es 10):>>> con.setlimit(sqlite3.SQLITE_LIMIT_ATTACHED, 1) 10 >>> con.getlimit(sqlite3.SQLITE_LIMIT_ATTACHED) 1
Added in version 3.11.
- getconfig(op, /)¶
Consultar una opción de configuración de conexión booleana.
- Parámetros:
op (int) – Un SQLITE_DBCONFIG code.
- Tipo del valor devuelto:
Added in version 3.12.
- setconfig(op, enable=True, /)¶
Establezca una opción de configuración de conexión booleana.
- Parámetros:
op (int) – Un SQLITE_DBCONFIG code.
enable (bool) –
Truesi la opción de configuración debe estar habilitada (predeterminado);Falsesi debe estar deshabilitada.
Added in version 3.12.
- serialize(*, name='main')¶
Serializa la base de datos en un objeto
bytes. Para un archivo ordinario de base de datos en disco, la serialización es solo una copia del archivo de disco. Para el caso de una base de datos en memoria o una base de datos «temp», la serialización es la misma secuencia de bytes que se escribiría en el disco si se hiciera una copia de seguridad de esa base de datos en el disco.- Parámetros:
name (str) – El nombre de la base de datos a ser serializada. El valor por defecto es
"main".- Tipo del valor devuelto:
Nota
Este método solo está disponible si las capas internas de la biblioteca SQLite tienen la API serialise.
Added in version 3.11.
- deserialize(data, /, *, name='main')¶
Deserializa una base de datos
serializsdaen una claseConnection. Este método hace que la conexión de base de datos se desconecte de la base de datos name, y la abre nuevamente como una base de datos en memoria, basada en la serialización contenida en data.- Parámetros:
- Muestra:
OperationalError – Si la conexión con la base de datos está actualmente involucrada en una transacción de lectura o una operación de copia de seguridad.
DatabaseError – Si data no contiene una base de datos SQLite válida.
OverflowError – Si
len(data)es más grande que2**63 - 1.
Nota
Este método solo está disponible si las capas internas de la biblioteca SQLite tienen la API deserialize.
Added in version 3.11.
- autocommit¶
Este atributo controla el comportamiento de las transacciones conforme a PEP 249.
autocommittiene tres valores permitidos:False: Seleccione un comportamiento de transacción compatible con PEP 249, lo que implica quesqlite3garantiza que una transacción esté siempre abierta. Utilicecommit()yrollback()para cerrar transacciones.Este es el valor recomendado de
autocommit.True: Utilice autocommit mode de SQLite.commit()yrollback()no tienen efecto en este modo.LEGACY_TRANSACTION_CONTROL: Control de transacciones anterior a Python 3.12 (no compatible con PEP 249). Consulteisolation_levelpara obtener más detalles.Este es actualmente el valor predeterminado de
autocommit.
Cambiar
autocommitaFalseabrirá una nueva transacción y cambiarlo aTrueconfirmará cualquier transacción pendiente.Consulte Control de transacciones mediante el atributo autocommit para obtener más detalles.
Nota
El atributo
isolation_levelno tiene efecto a menos queautocommitseaLEGACY_TRANSACTION_CONTROL.Added in version 3.12.
- in_transaction¶
Este atributo de solo lectura corresponde al autocommit mode de SQLite de bajo nivel.
Truesi una transacción está activa (existen cambios sin confirmar),``False`` en caso contrario.Added in version 3.2.
- isolation_level¶
Controla el legacy transaction handling mode de
sqlite3. Si se configura enNone, las transacciones nunca se abren de forma implícita. Si se configura en uno de los valores"DEFERRED","IMMEDIATE"o"EXCLUSIVE", correspondiente al SQLite transaction behaviour subyacente, se ejecuta implicit transaction management.Si no se sobreescribe por el parámetro isolation_level de
connect(), el valor predeterminado es"", que es un alias para"DEFERRED".Nota
Se recomienda utilizar
autocommitpara controlar el manejo de transacciones en lugar deisolation_level.isolation_levelno tiene efecto a menos queautocommitse configure enLEGACY_TRANSACTION_CONTROL(el valor predeterminado).
- row_factory¶
El
row_factoryinicial para los objetosCursorcreados a partir de esta conexión. La asignación a este atributo no afecta alrow_factoryde los cursores existentes que pertenecen a esta conexión, solo a los nuevos. EsNonede forma predeterminada, lo que significa que cada fila se devuelve comotuple.Consulte Cómo crear y utilizar fábricas de filas para obtener más detalles.
- text_factory¶
Un callable que acepta un parámetro
bytesy devuelve una representación de texto del mismo. El objeto invocable se invoca para valores SQLite con el tipo de datosTEXT. De manera predeterminada, este atributo está configurado enstr.Consulte Cómo manejar codificaciones de texto que no sean UTF-8 para obtener más detalles.
- total_changes¶
Retorna el número total de filas de la base de datos que han sido modificadas, insertadas o borradas desde que la conexión a la base de datos fue abierta.
Objetos cursor¶
Un objeto
Cursorrepresenta un database cursor que se utiliza para ejecutar sentencias SQL y administrar el contexto de una operación de búsqueda. Los cursores son creados usandoConnection.cursor(), o por usar alguno de los connection shortcut methods.Los objetos cursores son iterators, lo que significa que si
execute()una consultaSELECT, simplemente podrás iterar sobre el cursor para obtener las filas resultantes:for row in cur.execute("SELECT t FROM data"): print(row)
- class sqlite3.Cursor¶
Una instancia
Cursortiene los siguientes atributos y métodos.- execute(sql, parameters=(), /)¶
Ejecuta una única declaración SQL, vinculando opcionalmente valores de Python mediante placeholders.
- Parámetros:
sql (str) – Una sola declaración SQL.
parameters (
dict| sequence) – Valores de Python para vincular a marcadores de posición en sql. Undictsi se utilizan marcadores de posición con nombre. Un sequence si se utilizan marcadores de posición sin nombre. Consulte Cómo usar marcadores de posición para vincular valores en consultas SQL.
- Muestra:
ProgrammingError – Si sql contiene más de una declaración SQL.
Si
autocommitesLEGACY_TRANSACTION_CONTROL,isolation_levelno esNone, sql es una declaraciónINSERT,UPDATE,DELETEoREPLACEy no hay ninguna transacción abierta, se abre implícitamente una transacción antes de ejecutar sql.Deprecated since version 3.12, will be removed in version 3.14: Se emite
DeprecationWarningsi se utilizan named placeholders y parameters es una secuencia en lugar dedict. A partir de Python 3.14, se emitiráProgrammingErroren su lugar.Utilice
executescript()para ejecutar múltiples declaraciones SQL.
- executemany(sql, parameters, /)¶
Para cada elemento en parameters, ejecute repetidamente la instrucción SQL parameterized DML sql.
Utiliza el mismo manejo de transacciones implícitas que
execute().- Parámetros:
sql (str) – Una sola declaración DML de SQL.
parameters (iterable) – Un iterable de parámetros para vincular con los marcadores de posición en sql. Consulte Cómo usar marcadores de posición para vincular valores en consultas SQL.
- Muestra:
ProgrammingError – Si sql contiene más de una declaración SQL o no es una declaración DML.
Ejemplo:
rows = [ ("row1",), ("row2",), ] # cur is an sqlite3.Cursor object cur.executemany("INSERT INTO data VALUES(?)", rows)
Nota
Se descartan todas las filas resultantes, incluidas las declaraciones DML con RETURNING clauses.
Deprecated since version 3.12, will be removed in version 3.14: Se emite
DeprecationWarningsi se utilizan named placeholders y los elementos en parameters son secuencias en lugar dedict. A partir de Python 3.14, se emitiráProgrammingErroren su lugar.
- executescript(sql_script, /)¶
Ejecute las sentencias SQL en sql_script. Si
autocommitesLEGACY_TRANSACTION_CONTROLy hay una transacción pendiente, primero se ejecuta una sentenciaCOMMITimplícita. No se realiza ningún otro control de transacción implícito; cualquier control de transacción debe agregarse a sql_script.sql_script debe ser una instancia de
string.Ejemplo:
# cur is an sqlite3.Cursor object cur.executescript(""" BEGIN; CREATE TABLE person(firstname, lastname, age); CREATE TABLE book(title, author, published); CREATE TABLE publisher(name, address); COMMIT; """)
- fetchone()¶
Si
row_factoryesNone, devuelve el siguiente conjunto de resultados de consulta de fila comotuple. De lo contrario, páselo a la fábrica de filas y devuelve su resultado. DevuelveNonesi no hay más datos disponibles.
- fetchmany(size=cursor.arraysize)¶
Retorna el siguiente conjunto de filas del resultado de una consulta como una
list. Una lista vacía será retornada cuando no hay más filas disponibles.El número de filas que se van a obtener por llamada se especifica mediante el parámetro size. Si size no es informado, entonces
arraysizedeterminará el número de filas que se van a recuperar. Si hay menos filas size disponibles, se retornan tantas filas como estén disponibles.Nótese que hay consideraciones de desempeño involucradas con el parámetro size. Para un optimo desempeño, es usualmente mejor usar el atributo arraysize. Si el parámetro size es usado, entonces es mejor retener el mismo valor de una llamada
fetchmany()a la siguiente.Distinto en la versión 3.13.8: Negative size values are rejected by raising
ValueError.
- fetchall()¶
Retorna todas las filas (restantes) de un resultado de consulta como
list. Retorna una lista vacía si no hay filas disponibles. Tenga en cuenta que el atributoarraysizepuede afectar al rendimiento de esta operación.
- close()¶
Cierra el cursor ahora (en lugar que cuando
__del__es llamado)El cursor no será usable de este punto en adelante; una excepción
ProgrammingErrorserá lanzada si se intenta cualquier operación con el cursor.
- setinputsizes(sizes, /)¶
Requerido por la DB-API. No hace nada en
sqlite3.
- setoutputsize(size, column=None, /)¶
Requerido por la DB-API. No hace nada en
sqlite3.
- arraysize¶
Atributo de lectura/escritura que controla el número de filas retornadas por
fetchmany(). El valor por defecto es 1, lo cual significa que una única fila será obtenida por llamada.Distinto en la versión 3.13.8: Negative values are rejected by raising
ValueError.
- connection¶
Este atributo de solo lectura que provee la
Connectionde la base de datos SQLite pertenece al cursor. Un objetoCursorcreado llamando acon.cursor()tendrá un atributoconnectionque hace referencia a con:>>> con = sqlite3.connect(":memory:") >>> cur = con.cursor() >>> cur.connection == con True >>> con.close()
- description¶
Este atributo de solo lectura provee el nombre de las columnas de la última consulta. Para seguir siendo compatible con la API de base de datos de Python, retornará una tupla de 7 elementos para cada columna donde los últimos seis elementos de cada tupla son
Ninguno.También es configurado para sentencias
SELECTsin ninguna fila coincidente.
- lastrowid¶
Atributo de solo lectura que proporciona el identificador de fila de la última insertada. Solo se actualiza después de que las sentencias
INSERToREPLACEhayan sido exitosas usando el métodoexecute(). Para otras instrucciones, después deexecutemany()oexecutescript(), o si se produjo un error en la inserción, el valor delastrowidse deja sin cambios. El valor inicial delastrowidesNone.Nota
Las inserciones en tablas
WITHOUT ROWIDno se registran.Distinto en la versión 3.6: Se agregó soporte para sentencias
REPLACE.
- rowcount¶
Atributo de solo lectura que proporciona la cantidad de filas modificadas para las instrucciones
INSERT,UPDATE,DELETEyREPLACE; es-1para otras instrucciones, incluidas las consultas CTE (Common Table Expression) . Solo se actualiza mediante los métodosexecute()yexecutemany(), después de que la instrucción se haya ejecutado hasta su finalización. Esto significa que se deben obtener todas las filas resultantes para que se actualicerowcount.
- row_factory¶
Controla cómo se representa una fila obtenida de este
Cursor. Si esNone, una fila se representa comotuple. Se puede configurar comosqlite3.Rowincluido; o como callable que acepta dos argumentos, un objetoCursory eltuplede valores de fila, y devuelve un objeto personalizado que representa una fila de SQLite.El valor predeterminado es el valor que se estableció en
Connection.row_factorycuando se creóCursor. La asignación a este atributo no afecta aConnection.row_factoryde la conexión principal.Consulte Cómo crear y utilizar fábricas de filas para obtener más detalles.
Objetos fila (Row)¶
- class sqlite3.Row¶
Una instancia de
Rowsirve como una instanciarow_factoryaltamente optimizada para objetosConnection. Admite iteración, pruebas de igualdad, acceso alen()y mapping por nombre de columna e índice.Dos objetos
Rowse consideran iguales si tienen nombres de columna y valores idénticos.Consulte Cómo crear y utilizar fábricas de filas para obtener más detalles.
- keys()¶
Este método retorna una
listcon los nombre de columnas comostrings. Inmediatamente después de una consulta, es el primer miembro de cada tupla enCursor.description.
Distinto en la versión 3.5: Agrega soporte para segmentación.
Objetos fila (Row)¶
- class sqlite3.Blob¶
Added in version 3.11.
Una instancia
Blobes un file-like object que puede leer y escribir datos en un SQLite BLOB. Llame alen(blob)para obtener el tamaño (número de bytes) del blob. Use índices y slices para obtener acceso directo a los datos del blob.Use
Blobcomo context manager para asegurarse de que el identificador de blob se cierra después de su uso.con = sqlite3.connect(":memory:") con.execute("CREATE TABLE test(blob_col blob)") con.execute("INSERT INTO test(blob_col) VALUES(zeroblob(13))") # Write to our blob, using two write operations: with con.blobopen("test", "blob_col", 1) as blob: blob.write(b"hello, ") blob.write(b"world.") # Modify the first and last bytes of our blob blob[0] = ord("H") blob[-1] = ord("!") # Read the contents of our blob with con.blobopen("test", "blob_col", 1) as blob: greeting = blob.read() print(greeting) # outputs "b'Hello, world!'" con.close()
- close()¶
Cierra el blob.
El cursor no será usable de este punto en adelante; una excepción
Error(o subclase) será lanzada si se intenta cualquier operación con el cursor.
- read(length=-1, /)¶
Leer bytes length de datos del blob en la posición de desplazamiento actual. Si se alcanza el final del blob, se devolverán los datos hasta EOF. Cuando length no se especifica, o es negativo,
read()se leerá hasta el final del blob.
- write(data, /)¶
Escriba data en el blob en el desplazamiento actual. Esta función no puede cambiar la longitud del blob. Escribir más allá del final del blob generará un
ValueError.
- tell()¶
Devolver la posición de acceso actual del blob.
- seek(offset, origin=os.SEEK_SET, /)¶
Establezca la posición de acceso actual del blob en offset. El argumento origin tiene como valor predeterminado
os.SEEK_SET(posición absoluta del blob). Otros valores para origin sonos.SEEK_CUR(búsqueda relativa a la posición actual) yos.SEEK_END(búsqueda relativa al final del blob).
Objetos PrepareProtocol¶
- class sqlite3.PrepareProtocol¶
El único propósito del tipo PrepareProtocol es actuar como un protocolo de adaptación de estilo PEP 246 para objetos que pueden adapt themselves a native SQLite types.
Excepciones¶
La jerarquía de excepciones está definida por DB-API 2.0 (PEP 249).
- exception sqlite3.Warning¶
Esta excepción no se genera actualmente en el módulo
sqlite3, pero puede ser provocada por aplicaciones que usan :mod:!sqlite3`, por ejemplo, si una función definida por el usuario trunca datos durante la inserción.Warninges una subclase deException.
- exception sqlite3.Error¶
La clase base de las otras excepciones de este módulo. Use esto para detectar todos los errores con una sola instrucción
except.``Error`` is una subclase deException.Si la excepción se originó dentro de la biblioteca SQLite, se agregan los siguientes dos atributos a la excepción:
- sqlite_errorcode¶
El código de error numérico de SQLite API
Added in version 3.11.
- sqlite_errorname¶
El nombre simbólico del código de error numérico de SQLite API
Added in version 3.11.
- exception sqlite3.InterfaceError¶
Excepción lanzada por el uso indebido de la API de SQLite C de bajo nivel. En otras palabras, si se lanza esta excepción, probablemente indica un error en el módulo
sqlite3.InterfaceErrores una subclase deError.
- exception sqlite3.DatabaseError¶
Excepción lanzada por errores relacionados con la base de datos. Esto sirve como excepción base para varios tipos de errores de base de datos. Solo se genera implícitamente a través de las subclases especializadas.
DatabaseErrores una subclase deError.
- exception sqlite3.DataError¶
Excepción lanzada por errores causados por problemas con los datos procesados, como valores numéricos fuera de rango y cadenas de caracteres demasiado largas.
DataErrores una subclase deDatabaseError.
- exception sqlite3.OperationalError¶
Excepción lanzada por errores que están relacionados con el funcionamiento de la base de datos y no necesariamente bajo el control del programador. Por ejemplo, no se encuentra la ruta de la base de datos o no se pudo procesar una transacción.
OperationalErrores una subclase deDatabaseError.
- exception sqlite3.IntegrityError¶
Excepción lanzada cuando la integridad de la base de datos es afectada, por ejemplo la comprobación de una llave foránea falla. Es una subclase de
DatabaseError.
- exception sqlite3.InternalError¶
Se genera una excepción cuando SQLite encuentra un error interno. Si se genera esto, puede indicar que hay un problema con la biblioteca SQLite en tiempo de ejecución.
InternalErrores una subclase deDatabaseError.
- exception sqlite3.ProgrammingError¶
Excepción lanzada por errores de programación de la API de
sqlite3, por ejemplo, proporcionar el número incorrecto de enlaces a una consulta, o intentar operar en unaConnectioncerrada.ProgrammingErrores una subclase deDatabaseError.
- exception sqlite3.NotSupportedError¶
Excepción lanzada en caso que la biblioteca SQLite subyacente no admita un método o una API de base de datos. Por ejemplo, establecer determinista como
Verdaderoencreate_function(), si la biblioteca SQLite subyacente no admite funciones deterministic.NotSupportedErrores una subclase deDatabaseError.
SQLite y tipos de Python¶
SQLite soporta de forma nativa los siguientes tipos: NULL, INTEGER, REAL, TEXT, BLOB.
Los siguientes tipos de Python se pueden enviar a SQLite sin problema alguno:
Tipo de Python |
Tipo de SQLite |
|---|---|
|
|
|
|
|
|
|
|
|
De esta forma es como los tipos de SQLite son convertidos a tipos de Python por defecto:
Tipo de SQLite |
Tipo de Python |
|---|---|
|
|
|
|
|
|
|
depende de |
|
El sistema de tipos del módulo sqlite3 es extensible en dos formas: se puede almacenar tipos de Python adicionales en una base de datos SQLite vía a objetos adaptadores, y se puede permitir que sqlite3 convierta tipos SQLite a diferentes tipos de Python vía converters.
Adaptadores y convertidores predeterminados (en desuso)¶
Nota
Los adaptadores y convertidores predeterminados están obsoletos a partir de Python 3.12. En su lugar, utilice Ejemplos para adaptadores y convertidores y adáptelos a sus necesidades.
Los adaptadores y convertidores predeterminados obsoletos consisten en:
Un adaptador para objetos
datetime.dateastringsen formato ISO 8601.Un adaptador para objetos
datetime.datetimea cadenas en formato ISO 8601.Un convertidor de tipos «fecha» declared a objetos
datetime.date.Un convertidor de tipos de «marca de tiempo» declarados a objetos
datetime.datetime. Las partes fraccionarias se truncarán a 6 dígitos (precisión de microsegundos).
Nota
El convertidor por defecto «timestamp» ignora las compensaciones UTC en la base de datos y siempre devuelve un objeto datetime.datetime naive. Para conservar las compensaciones UTC en las marcas de tiempo, deje los convertidores deshabilitados o registre un convertidor que reconozca la compensación con register_converter().
Obsoleto desde la versión 3.12.
Interfaz de línea de comandos¶
El módulo sqlite3 se puede invocar como un script, utilizando el modificador -m del intérprete, para proporcionar un shell SQLite simple. La firma del argumento es la siguiente:
python -m sqlite3 [-h] [-v] [filename] [sql]
Escriba .quit o CTRL-D para salir del shell.
- -h, --help¶
Ayuda de la CLI de impresión.
- -v, --version¶
Imprima la versión de la biblioteca SQLite subyacente.
Added in version 3.12.
Guías prácticas¶
Cómo usar marcadores de posición para vincular valores en consultas SQL¶
Las operaciones SQL suelen necesitar utilizar valores de variables de Python. Sin embargo, tenga cuidado al utilizar las operaciones de cadena de Python para ensamblar consultas, ya que son vulnerables a SQL injection attacks. Por ejemplo, un atacante puede simplemente cerrar la comilla simple e inyectar OR TRUE para seleccionar todas las filas:
>>> # Never do this -- insecure!
>>> symbol = input()
' OR TRUE; --
>>> sql = "SELECT * FROM stocks WHERE symbol = '%s'" % symbol
>>> print(sql)
SELECT * FROM stocks WHERE symbol = '' OR TRUE; --'
>>> cur.execute(sql)
En su lugar, utilice la sustitución de parámetros de DB-API. Para insertar una variable en una cadena de consulta, utilice un marcador de posición en la cadena y sustituya los valores reales en la consulta proporcionándolos como un tuple de valores al segundo argumento del método execute() del cursor.
Una sentencia SQL puede utilizar uno de dos tipos de marcadores de posición: signos de interrogación (estilo qmark) o marcadores de posición con nombre (estilo con nombre). Para el estilo qmark, parameters debe ser un sequence cuya longitud debe coincidir con el número de marcadores de posición, o se genera un ProgrammingError. Para el estilo con nombre, parameters debe ser una instancia de un dict (o una subclase), que debe contener claves para todos los parámetros con nombre; se ignoran todos los elementos adicionales. A continuación, se muestra un ejemplo de ambos estilos:
con = sqlite3.connect(":memory:")
cur = con.execute("CREATE TABLE lang(name, first_appeared)")
# This is the named style used with executemany():
data = (
{"name": "C", "year": 1972},
{"name": "Fortran", "year": 1957},
{"name": "Python", "year": 1991},
{"name": "Go", "year": 2009},
)
cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)
# This is the qmark style used in a SELECT query:
params = (1972,)
cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
print(cur.fetchall())
con.close()
Nota
Los marcadores de posición numéricos PEP 249 son compatibles con not. Si se utilizan, se interpretarán como marcadores de posición con nombre.
Cómo adaptar tipos de Python personalizados a valores de SQLite¶
SQLite solo admite un conjunto limitado de tipos de datos de forma nativa. Para almacenar tipos personalizados de Python en bases de datos SQLite, adáptelos a uno de los tipos Python que SQLite entiende de forma nativa.
Hay dos formas de adaptar los objetos de Python a los tipos de SQLite: dejar que su objeto se adapte a sí mismo o usar un adapter callable. Este último prevalecerá sobre el primero. Para una biblioteca que exporta un tipo personalizado, puede tener sentido permitir que ese tipo se adapte. Como desarrollador de aplicaciones, puede tener más sentido tomar el control directo registrando funciones de adaptador personalizadas.
Cómo escribir objetos adaptables¶
Supongamos que tenemos una clase Point que representa un par de coordenadas, x e y, en un sistema de coordenadas cartesianas. El par de coordenadas se almacenará como una cadena de texto en la base de datos, utilizando un punto y coma para separar las coordenadas. Esto se puede implementar agregando un método __conform__(self, protocol) que retorna el valor adaptado. El objeto pasado a protocolo será de tipo PrepareProtocol.
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __conform__(self, protocol):
if protocol is sqlite3.PrepareProtocol:
return f"{self.x};{self.y}"
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("SELECT ?", (Point(4.0, -3.2),))
print(cur.fetchone()[0])
con.close()
Como registrar un adaptador invocable¶
La otra posibilidad es crear una función que convierta el objeto Python a un tipo compatible de SQLite. Esta función puede de esta forma ser registrada usando un register_adapter().
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def adapt_point(point):
return f"{point.x};{point.y}"
sqlite3.register_adapter(Point, adapt_point)
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("SELECT ?", (Point(1.0, 2.5),))
print(cur.fetchone()[0])
con.close()
Como convertir valores SQLite a tipos de Python personalizados¶
Escribir un adaptador le permite convertir de tipos personalizados de Python a valores SQLite. Para poder convertir de valores SQLite a tipos personalizados de Python, usamos convertidores.
Regresemos a la clase Point. Almacenamos las coordenadas x y y separadas por punto y coma como una cadena de caracteres en SQLite.
Primero, se define una función de conversión que acepta la cadena de texto como un parámetro y construya un objeto Point de ahí.
Nota
Las funciones de conversión siempre son llamadas con un objeto bytes, no importa bajo qué tipo de dato se envió el valor a SQLite.
def convert_point(s):
x, y = map(float, s.split(b";"))
return Point(x, y)
Ahora necesitamos decirle a sqlite3 cuando debería convertir un valor dado SQLite. Esto se hace cuando se conecta a una base de datos, utilizando el parámetro detect_types de connect(). Hay tres opciones:
Implícito: establece detect_types para que
PARSE_DECLTYPESExplícito: establece detect_types para que
PARSE_COLNAMESAmbos: establece detect_types para
sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES. Los nombres de columna tienen prioridad sobre los tipos declarados.
El siguiente ejemplo ilustra ambos enfoques:
class Point:
def __init__(self, x, y):
self.x, self.y = x, y
def __repr__(self):
return f"Point({self.x}, {self.y})"
def adapt_point(point):
return f"{point.x};{point.y}"
def convert_point(s):
x, y = list(map(float, s.split(b";")))
return Point(x, y)
# Register the adapter and converter
sqlite3.register_adapter(Point, adapt_point)
sqlite3.register_converter("point", convert_point)
# 1) Parse using declared types
p = Point(4.0, -3.2)
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.execute("CREATE TABLE test(p point)")
cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute("SELECT p FROM test")
print("with declared types:", cur.fetchone()[0])
cur.close()
con.close()
# 2) Parse using column names
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
cur = con.execute("CREATE TABLE test(p)")
cur.execute("INSERT INTO test(p) VALUES(?)", (p,))
cur.execute('SELECT p AS "p [point]" FROM test')
print("with column names:", cur.fetchone()[0])
cur.close()
con.close()
Ejemplos para adaptadores y convertidores¶
En esta sección se muestran ejemplos para adaptadores y convertidores comunes.
import datetime
import sqlite3
def adapt_date_iso(val):
"""Adapt datetime.date to ISO 8601 date."""
return val.isoformat()
def adapt_datetime_iso(val):
"""Adapt datetime.datetime to timezone-naive ISO 8601 date."""
return val.replace(tzinfo=None).isoformat()
def adapt_datetime_epoch(val):
"""Adapt datetime.datetime to Unix timestamp."""
return int(val.timestamp())
sqlite3.register_adapter(datetime.date, adapt_date_iso)
sqlite3.register_adapter(datetime.datetime, adapt_datetime_iso)
sqlite3.register_adapter(datetime.datetime, adapt_datetime_epoch)
def convert_date(val):
"""Convert ISO 8601 date to datetime.date object."""
return datetime.date.fromisoformat(val.decode())
def convert_datetime(val):
"""Convert ISO 8601 datetime to datetime.datetime object."""
return datetime.datetime.fromisoformat(val.decode())
def convert_timestamp(val):
"""Convert Unix epoch timestamp to datetime.datetime object."""
return datetime.datetime.fromtimestamp(int(val))
sqlite3.register_converter("date", convert_date)
sqlite3.register_converter("datetime", convert_datetime)
sqlite3.register_converter("timestamp", convert_timestamp)
Cómo utilizar los métodos de acceso directo de conexión¶
Usando los métodos execute(), executemany(), y executescript() de la clase Connection, su código se puede escribir de manera más concisa porque no tiene que crear los (a menudo superfluo) objetos Cursor explícitamente. Por el contrario, los objetos Cursor son creados implícitamente y esos métodos de acceso directo retornarán objetos cursores. De esta forma, se puede ejecutar una sentencia SELECT e iterar sobre ella directamente usando un simple llamado sobre el objeto de clase Connection.
# Create and fill the table.
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(name, first_appeared)")
data = [
("C++", 1985),
("Objective-C", 1984),
]
con.executemany("INSERT INTO lang(name, first_appeared) VALUES(?, ?)", data)
# Print the table contents
for row in con.execute("SELECT name, first_appeared FROM lang"):
print(row)
print("I just deleted", con.execute("DELETE FROM lang").rowcount, "rows")
# close() is not a shortcut method and it's not called automatically;
# the connection object should be closed manually
con.close()
Como usar la conexión con un administrador de contexto¶
Un objeto Connection se puede utilizar como un administrador de contexto que confirma o revierte automáticamente las transacciones abiertas al salir del cuerpo del administrador de contexto. Si el cuerpo de la instrucción with finaliza sin excepciones, la transacción se confirma. Si esta confirmación falla, o si el cuerpo de la instrucción with genera una excepción no detectada, la transacción se revierte. Si autocommit es False, se abre implícitamente una nueva transacción después de confirmar o revertir.
Si no hay ninguna transacción abierta al salir del cuerpo de la declaración with, o si autocommit es True, el administrador de contexto no hace nada.
Nota
El administrador de contexto no abre implícitamente una nueva transacción ni cierra la conexión. Si necesita un administrador de contexto de cierre, considere usar contextlib.closing().
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE lang(id INTEGER PRIMARY KEY, name VARCHAR UNIQUE)")
# Successful, con.commit() is called automatically afterwards
with con:
con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
# con.rollback() is called after the with block finishes with an exception,
# the exception is still raised and must be caught
try:
with con:
con.execute("INSERT INTO lang(name) VALUES(?)", ("Python",))
except sqlite3.IntegrityError:
print("couldn't add Python twice")
# Connection object used as context manager only commits or rollbacks transactions,
# so the connection object should be closed manually
con.close()
Como trabajar con URIs SQLite¶
Algunos trucos útiles de URI incluyen:
Abra una base de datos en modo de solo lectura:
>>> con = sqlite3.connect("file:tutorial.db?mode=ro", uri=True)
>>> con.execute("CREATE TABLE readonly(data)")
Traceback (most recent call last):
OperationalError: attempt to write a readonly database
>>> con.close()
No cree implícitamente un nuevo archivo de base de datos si aún no existe; esto lanzará un
OperationalErrorsi no puede crear un nuevo archivo:
>>> con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True)
Traceback (most recent call last):
OperationalError: unable to open database file
Crea un nombre compartido sobre una base de datos en memoria:
db = "file:mem1?mode=memory&cache=shared"
con1 = sqlite3.connect(db, uri=True)
con2 = sqlite3.connect(db, uri=True)
with con1:
con1.execute("CREATE TABLE shared(data)")
con1.execute("INSERT INTO shared VALUES(28)")
res = con2.execute("SELECT data FROM shared")
assert res.fetchone() == (28,)
con1.close()
con2.close()
Más información sobre esta característica, incluyendo una lista de opciones reconocidas, pueden encontrarse en SQLite URI documentation.
Cómo crear y utilizar fábricas de filas¶
De forma predeterminada, sqlite3 representa cada fila como tuple. Si tuple no se adapta a sus necesidades, puede utilizar la clase sqlite3.Row o una row_factory personalizada.
Si bien row_factory existe como atributo tanto en Cursor como en Connection, se recomienda configurar Connection.row_factory, de modo que todos los cursores creados a partir de la conexión utilicen la misma fábrica de filas.
Row proporciona acceso indexado y sin distinción entre mayúsculas y minúsculas a las columnas, con una sobrecarga de memoria y un impacto en el rendimiento mínimos en comparación con tuple. Para utilizar Row como una fábrica de filas, asígnelo al atributo row_factory:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = sqlite3.Row
Las consultas ahora devuelven objetos Row:
>>> res = con.execute("SELECT 'Earth' AS name, 6378 AS radius")
>>> row = res.fetchone()
>>> row.keys()
['name', 'radius']
>>> row[0] # Access by index.
'Earth'
>>> row["name"] # Access by name.
'Earth'
>>> row["RADIUS"] # Column names are case-insensitive.
6378
>>> con.close()
Nota
La cláusula FROM se puede omitir en la declaración SELECT, como en el ejemplo anterior. En tales casos, SQLite devuelve una sola fila con columnas definidas por expresiones, por ejemplo, literales, con los alias indicados expr AS alias.
Puede crear un row_factory personalizado que devuelva cada fila como un dict, con nombres de columnas asignados a valores:
def dict_factory(cursor, row):
fields = [column[0] for column in cursor.description]
return {key: value for key, value in zip(fields, row)}
Al usarlo, las consultas ahora devuelven un dict en lugar de un tuple:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = dict_factory
>>> for row in con.execute("SELECT 1 AS a, 2 AS b"):
... print(row)
{'a': 1, 'b': 2}
>>> con.close()
La siguiente fábrica de filas devuelve un named tuple:
from collections import namedtuple
def namedtuple_factory(cursor, row):
fields = [column[0] for column in cursor.description]
cls = namedtuple("Row", fields)
return cls._make(row)
namedtuple_factory() se puede utilizar de la siguiente manera:
>>> con = sqlite3.connect(":memory:")
>>> con.row_factory = namedtuple_factory
>>> cur = con.execute("SELECT 1 AS a, 2 AS b")
>>> row = cur.fetchone()
>>> row
Row(a=1, b=2)
>>> row[0] # Indexed access.
1
>>> row.b # Attribute access.
2
>>> con.close()
Con algunos ajustes, la receta anterior se puede adaptar para utilizar un dataclass, o cualquier otra clase personalizada, en lugar de un namedtuple.
Cómo manejar codificaciones de texto que no sean UTF-8¶
De forma predeterminada, sqlite3 utiliza str para adaptar los valores de SQLite con el tipo de datos TEXT. Esto funciona bien para texto codificado en UTF-8, pero puede fallar para otras codificaciones y UTF-8 no válido. Puede utilizar un text_factory personalizado para manejar estos casos.
Debido a flexible typing de SQLite, no es raro encontrar columnas de tabla con el tipo de datos TEXT que contienen codificaciones que no son UTF-8, o incluso datos arbitrarios. Para demostrarlo, supongamos que tenemos una base de datos con texto codificado en ISO-8859-2 (Latin-2), por ejemplo, una tabla de entradas de diccionario checo-inglés. Suponiendo que ahora tenemos una instancia Connection con conectada a esta base de datos, podemos decodificar el texto codificado en Latin-2 utilizando este text_factory:
con.text_factory = lambda data: str(data, encoding="latin2")
Para datos UTF-8 no válidos o arbitrarios almacenados en las columnas de la tabla TEXT, puede utilizar la siguiente técnica, tomada prestada de CÓMO (HOWTO) Unicode:
con.text_factory = lambda data: str(data, errors="surrogateescape")
Nota
La API del módulo sqlite3 no admite cadenas que contengan sustitutos.
Ver también
Explicación¶
Control transaccional¶
sqlite3 ofrece múltiples métodos para controlar si se abren y cierran las transacciones de la base de datos, cuándo y cómo. Se recomienda Control de transacciones mediante el atributo autocommit, mientras que Control de transacciones mediante el atributo isolation_level conserva el comportamiento anterior a Python 3.12.
Control de transacciones mediante el atributo autocommit¶
La forma recomendada de controlar el comportamiento de las transacciones es a través del atributo Connection.autocommit, que preferiblemente debe configurarse utilizando el parámetro autocommit de connect().
Se recomienda configurar autocommit en False, lo que implica un control de transacciones compatible con PEP 249. Esto significa:
sqlite3garantiza que una transacción esté siempre abierta, por lo queconnect(),Connection.commit()yConnection.rollback()abrirán implícitamente una nueva transacción (inmediatamente después de cerrar la pendiente, en el caso de las dos últimas).sqlite3utiliza instruccionesBEGIN DEFERREDal abrir transacciones.Las transacciones deben confirmarse explícitamente mediante
commit().Las transacciones deben revertirse explícitamente utilizando
rollback().Se realiza una reversión implícita si la base de datos está modificada como
close()con cambios pendientes.
Establezca autocommit en True para habilitar autocommit mode de SQLite. En este modo, Connection.commit() y Connection.rollback() no tienen efecto. Tenga en cuenta que el modo de confirmación automática de SQLite es distinto del atributo Connection.autocommit compatible con PEP 249; utilice Connection.in_transaction para consultar el modo de confirmación automática de bajo nivel de SQLite.
Establezca autocommit en LEGACY_TRANSACTION_CONTROL para dejar el comportamiento de control de transacciones al atributo Connection.isolation_level. Consulte Control de transacciones mediante el atributo isolation_level para obtener más información.
Control de transacciones mediante el atributo isolation_level¶
Nota
La forma recomendada de controlar las transacciones es mediante el atributo autocommit. Consulte Control de transacciones mediante el atributo autocommit.
Si Connection.autocommit se configura en LEGACY_TRANSACTION_CONTROL (el valor predeterminado), el comportamiento de la transacción se controla mediante el atributo Connection.isolation_level. De lo contrario, isolation_level no tiene ningún efecto.
Si el atributo de conexión isolation_level no es None, las nuevas transacciones se abrirán implícitamente antes de execute() y executemany() ejecutará sentencias INSERT, UPDATE, DELETE o REPLACE; para otras sentencias, no se realiza ningún manejo de transacción implícito. Utilice los métodos commit() y rollback() para confirmar y deshacer respectivamente las transacciones pendientes. Puede elegir el SQLite transaction behaviour subyacente, es decir, si y qué tipo de declaraciones BEGIN sqlite3 se ejecutarán implícitamente, a través del atributo isolation_level.
Si isolation_level se establece como None, no se abre ninguna transacción implícitamente. Esto deja la biblioteca SQLite subyacente en autocommit mode, pero también permite que el usuario realice su propio manejo de transacciones usando declaraciones SQL explícitas. El modo de confirmación automática de la biblioteca SQLite subyacente se puede consultar mediante el atributo in_transaction.
El método executescript() guarda implícitamente cualquier transacción pendiente antes de la ejecución del script SQL dado, independientemente del valor de isolation_level.
Distinto en la versión 3.6: sqlite3 solía realizar commit en transacciones implícitamente antes de sentencias DDL. Este ya no es el caso.
Distinto en la versión 3.12: La forma recomendada de controlar las transacciones ahora es a través del atributo autocommit.