October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsClean PCRecommendedOne scan can reveal what keeps slowing WindowsLook for cleanup and repair opportunities.Run ScanOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk6 min

SQLite asíncrono con Python: CRUD y async/await sin bloquear el event loop

Una guía práctica para usar aiosqlite en aplicaciones asyncio: CRUD con parámetros enlazados, gestión de transacciones y límites reales del rendimiento asíncrono.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Para usar SQLite desde una aplicación Python con asyncio, aiosqlite ofrece una interfaz asíncrona para operaciones CRUD. Eso ayuda a que otras corrutinas puedan avanzar mientras la aplicación espera una operación de base de datos, pero no hace que una consulta SQL tarde menos ni convierte SQLite en una base de datos de red con E/S nativa no bloqueante. El rendimiento depende del trabajo SQL, los datos, el almacenamiento y la contención; hay que medir la carga real.

Qué significa realmente «SQLite asíncrono»

La API síncrona estándar de Python, sqlite3, ejecuta sus llamadas en el hilo que las invoca. Si una llamada tarda, ocupa ese hilo mientras trabaja. aiosqlite adapta el acceso a SQLite a una interfaz que se usa con await. Según la documentación del proyecto, cada conexión utiliza un hilo de trabajo compartido y una cola de solicitudes.

As an Amazon Associate I earn from qualifying purchases.

Ese diseño permite que el event loop atienda otras corrutinas mientras una solicitud espera su turno o se ejecuta en el hilo de trabajo. No significa que una consulta individual se ejecute más rápido, ni que la base de datos admita escrituras paralelas sin contención. «Asíncrono» describe aquí la interfaz y la coordinación con asyncio.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Elegir entre sqlite3 y aiosqlite

Aspecto sqlite3 aiosqlite
Interfaz API síncrona documentada por Python. Métodos asíncronos, usados con await.
Uso desde asyncio Una llamada síncrona puede ocupar el hilo que ejecuta la corrutina mientras trabaja. El proyecto describe una cola de solicitudes y un hilo compartido por conexión.
Transacciones Se controlan con autocommit, commit(), rollback() y, en el modo heredado, opciones como isolation_level. Se conserva el modelo transaccional de SQLite; compartir conexión y transacción exige coordinación.
Velocidad de una consulta Depende de la consulta, los índices, los datos, la transacción y el almacenamiento. La interfaz asíncrona no demuestra por sí sola una consulta más rápida.

La documentación de Python 3.13 recomienda controlar el comportamiento transaccional mediante Connection.autocommit. El valor predeterminado y el comportamiento de isolation_level dependen de la versión y del modo de transacción; al actualizar o mantener una aplicación, consulta la documentación correspondiente a la versión de Python que ejecuta el programa. Las operaciones asíncronas de aiosqlite no eliminan la necesidad de decidir cuándo confirmar o revertir una transacción.

Un patrón CRUD seguro con aiosqlite

Usa gestores de contexto para administrar la conexión y los cursores, y placeholders enlazados para los valores. El ejemplo crea una tabla, inserta un registro, lo lee, lo actualiza y finalmente lo elimina. Cada escritura se confirma explícitamente; en una aplicación real, delimita cada unidad de trabajo de acuerdo con sus requisitos de atomicidad.

import aiosqlite

async def crud(db_path: str, user_id: int, email: str) -> None:
    async with aiosqlite.connect(db_path) as db:
        await db.execute(
            """CREATE TABLE IF NOT EXISTS users (
                id INTEGER PRIMARY KEY,
                email TEXT NOT NULL
            )"""
        )
        await db.commit()

        # Create
        async with db.execute(
            "INSERT INTO users (id, email) VALUES (?, ?)",
            (user_id, email),
        ):
            pass
        await db.commit()

        # Read
        async with db.execute(
            "SELECT id, email FROM users WHERE id = ?",
            (user_id,),
        ) as cursor:
            row = await cursor.fetchone()

        # Update
        async with db.execute(
            "UPDATE users SET email = ? WHERE id = ?",
            (email, user_id),
        ):
            pass
        await db.commit()

        # Delete
        async with db.execute(
            "DELETE FROM users WHERE id = ?",
            (user_id,),
        ):
            pass
        await db.commit()

En el ejemplo, ? es un placeholder y los valores se pasan como parámetros separados. No construyas SQL interpolando texto recibido del usuario: los parámetros enlazados separan los datos de la sentencia. Los nombres de tablas y columnas no se sustituyen mediante estos placeholders; si deben variar, valídalos con una lista permitida antes de formar la consulta.

Leer varias filas

Para resultados potencialmente grandes, procesa el cursor de forma incremental en vez de cargar todo el conjunto de una vez:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
async with db.execute(
    "SELECT id, email FROM users ORDER BY id"
) as cursor:
    async for row in cursor:
        process(row)

process representa la lógica de tu aplicación. También puedes usar métodos del cursor, como fetchone(), cuando solo necesitas una fila, o un método de recuperación múltiple cuando el conjunto es apropiado para memoria. Cierra el cursor con el gestor de contexto incluso si el procesamiento termina antes de recorrer todas las filas.

Transacciones y concurrencia: el riesgo de compartir una conexión

El estado de una transacción SQLite pertenece a la conexión. El hilo y la cola de aiosqlite ordenan solicitudes para esa conexión, pero no aíslan automáticamente el trabajo lógico de una corrutina del de otra. Si varias tareas independientes intercalan operaciones en una conexión con una transacción abierta, pueden compartir ese estado. Un rollback() puede descartar cambios sin confirmar que otra corrutina hizo en la misma conexión.

Trata una unidad de escritura como una transacción con límites definidos: empieza el trabajo, ejecuta sus sentencias, confirma si todo va bien y revierte ante un error cuando corresponda. No permitas que tareas independientes intercalen operaciones dentro de una única transacción compartida sin coordinación explícita.

  • Asigna el acceso a la conexión de acuerdo con la unidad de trabajo, o serializa las operaciones que deban compartirla.
  • Si la aplicación usa varias conexiones o un pool, decide cómo se asignan a las tareas y limita la contención de escritores; no hay un tamaño de pool universal que garantice el mejor resultado.
  • Verifica que el rollback de una tarea no pueda afectar trabajo de otra y que el cierre de una conexión no ocurra mientras siga en uso.

SQLAlchemy también advierte sobre la interferencia entre corrutinas que comparten conexión y transacción. La concurrencia de tareas puede mejorar el aprovechamiento del event loop, pero no equivale a escrituras SQLite paralelas.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

WAL y synchronous=NORMAL: una decisión de durabilidad

El modo WAL puede ser útil en ciertos patrones de lectura y escritura, pero su comportamiento depende de los checkpoints y de los requisitos de durabilidad. La documentación oficial de SQLite explica que, con WAL y synchronous=NORMAL, no se llama a fsync() durante cada commit: esas llamadas se concentran en el checkpoint. Esto puede reducir esperas asociadas a sincronizar cada confirmación, pero implica una decisión sobre qué sucede ante una caída del sistema o un corte de energía.

Elige ese ajuste solo después de valorar el riesgo de pérdida de cambios recientes y la estrategia de checkpoint que necesita tu aplicación. La extensión histórica de E/S asíncrona de SQLite ya no se mantiene; la propia documentación señala que la E/S diferida de ese enfoque puede poner en riesgo la durabilidad tras una caída o pérdida de energía. WAL con synchronous=NORMAL no debe tratarse como una configuración universal para todas las aplicaciones.

Cómo evaluar el rendimiento de tu carga

No hay una cifra de mejora de velocidad aplicable a todas las aplicaciones CRUD: sin una carga, versiones, hardware y patrón de acceso comparables, un porcentaje sería engañoso. Compara tu aplicación bajo condiciones representativas y distingue qué métrica quieres mejorar.

  • Latencia: cuánto tarda una operación individual, incluidas las esperas que introduce tu diseño.
  • Throughput: cuántas unidades de trabajo completas procesa la aplicación durante un intervalo.
  • Concurrencia de lectores: cómo se comportan las lecturas cuando varias corrutinas consultan a la vez.
  • Contención de escritores: cuánto esperan o se bloquean las escrituras cuando compiten por modificar la base de datos.

Usa los mismos datos, consultas, índices, configuración transaccional y condiciones de almacenamiento al comparar variantes. Mide por separado el efecto de la interfaz asíncrona, la forma de agrupar escrituras y la configuración de SQLite; así podrás localizar si el límite está en el event loop, el diseño de consultas, la transacción o la contención.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fuentes técnicas

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Outdated Drivers Are Slowing You DownFree scan - exact matches

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.