Skip to main content

ODBC driver for asyncio.

Project description

GitHub Actions status for master branch https://codecov.io/gh/aio-libs/aioodbc/branch/master/graph/badge.svg https://img.shields.io/pypi/v/aioodbc.svg https://img.shields.io/pypi/pyversions/aioodbc.svg Chat on Gitter

aioodbc is a Python 3.7+ module that makes it possible to access ODBC databases with asyncio. It relies on the awesome pyodbc library and preserves the same look and feel. aioodbc was written using async/await syntax (PEP492) and thus is not compatible with Python versions older than 3.5. Internally aioodbc employs threads to avoid blocking the event loop, threads are not that as bad as you think!. Other drivers like motor use the same approach.

aioodbc is fully compatible and tested with uvloop. Take a look at the test suite, all tests are executed with both the default event loop and uvloop.

Basic Example

aioodbc is based on pyodbc and provides the same api, you just need to use yield from conn.f() or await conn.f() instead of conn.f()

Properties are unchanged, so conn.prop is correct as well as conn.prop = val.

import asyncio

import aioodbc


async def test_example():
    dsn = "Driver=SQLite;Database=sqlite.db"
    conn = await aioodbc.connect(dsn=dsn)

    cur = await conn.cursor()
    await cur.execute("SELECT 42 AS age;")
    rows = await cur.fetchall()
    print(rows)
    print(rows[0])
    print(rows[0].age)
    await cur.close()
    await conn.close()


asyncio.run(test_example())

Connection Pool

Connection pooling is ported from aiopg and relies on PEP492 features:

import asyncio

import aioodbc


async def test_pool():
    dsn = "Driver=SQLite3;Database=sqlite.db"
    pool = await aioodbc.create_pool(dsn=dsn)

    async with pool.acquire() as conn:
        cur = await conn.cursor()
        await cur.execute("SELECT 42;")
        r = await cur.fetchall()
        print(r)
        await cur.close()
        await conn.close()
    pool.close()
    await pool.wait_closed()


asyncio.run(test_pool())

Context Managers

Pool, Connection and Cursor objects support the context management protocol:

import asyncio

import aioodbc


async def test_example():
    dsn = "Driver=SQLite;Database=sqlite.db"

    async with aioodbc.create_pool(dsn=dsn) as pool:
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT 42 AS age;")
                val = await cur.fetchone()
                print(val)
                print(val.age)


asyncio.run(test_example())

Installation

In a linux environment pyodbc (hence aioodbc) requires the unixODBC library. You can install it using your package manager, for example:

$ sudo apt-get install unixodbc
$ sudo apt-get install unixodbc-dev

then:

pip install aioodbc

Run tests

For testing purposes you need to install docker and the development requirements:

$ pip install -r requirements-dev.txt

Then just execute:

$ make test

The test will automatically pull images and build containers with the required databases.

NOTE: Running tests requires Python 3.6 or higher.

Other SQL Drivers

  • aiopg - asyncio client for PostgreSQL

  • aiomysql - asyncio client form MySQL

Requirements

Changes

0.4.0 (2023-03-16)

  • Fixed compatibility with python 3.9+.

  • Removed usage of explicit loop parameter.

  • Added default read size parameter for cursor.

  • Updated tests and CI scripts.

  • Code base formatted with black.

0.3.3 (2019-07-05)

  • Parameter echo passed properly in cursor #185

  • Close bad connections before returning back to pool #195

0.3.2 (2018-08-04)

  • Added basic documentation for after_created and ThreadPoolExecutor #176 (thanks @AlexHagerman)

  • Cursor/connection context managers now rollback transaction on error, otherwise commit if autocommit=False #178 (thanks @julianit)

0.3.1 (2018-03-23)

  • Add after_create hook for connection configuration (thanks @lanfon72)

0.3.0 (2018-02-23)

  • Added optional pool connections recycling #167 (thanks @drpoggi)

0.2.0 (2017-06-24)

  • Fixed Cursor.execute returns a pyodbc.Cursor instead of itself #114

  • Fixed __aiter__ to not be awaitable for python>=3.5.2 #113

  • Tests now using aiodocker #106

0.1.0 (2017-04-30)

  • Fixed project version

0.0.4 (2017-04-30)

  • Improved mysql testing

0.0.3 (2016-07-05)

  • Dockerize tests, now we can add more DBs to tests using docker #15, #17, #19

  • Test suite executed with both default asyncio and uvloop #18

0.0.2 (2016-01-01)

  • Improved pep 492 support.

  • pool.get method removed, use acquire instead.

  • Added tests against MySQL.

  • Added bunch of doc strings.

0.0.1 (2015-10-12)

  • Initial release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aioodbc-0.4.0.tar.gz (23.2 kB view details)

Uploaded Source

Built Distribution

aioodbc-0.4.0-py3-none-any.whl (18.0 kB view details)

Uploaded Python 3

File details

Details for the file aioodbc-0.4.0.tar.gz.

File metadata

  • Download URL: aioodbc-0.4.0.tar.gz
  • Upload date:
  • Size: 23.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for aioodbc-0.4.0.tar.gz
Algorithm Hash digest
SHA256 908de65b85270a4470b5de28fd9adec4e5204f3c30cd88e692cc3efb283a439e
MD5 e9c81828a5b90401e662938331b93d7e
BLAKE2b-256 30651c285bd56b32b53eb30c90712c2398d7012c1f28e9effc056fb2ed1f6543

See more details on using hashes here.

File details

Details for the file aioodbc-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: aioodbc-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 18.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for aioodbc-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 359ad361b4b970a7f67291498e28f34ff307b7cb1117e4eb089632baa9a9dd78
MD5 ca99146ea360c0201930c17b6c4a1c2e
BLAKE2b-256 611716a3b26d2c2cf21409637d06c05445a9b1235381534fd52c5952967b060b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page