aioodbc is Python 3.5+ module that makes possible accessing ODBC databases with asyncio. It is rely on awesome pyodbc library, preserve same look and feel. aioodbc was written async/await syntax (PEP492) thus not compatible with Python older then 3.5. Internally aioodbc employ threads to avoid blocking the event loop, btw threads are not that bad as you think, other drivers like motor use same approach.
aioodbc fully compatible and tested with uvloop. Take a look on a test suite, all tests are executed with both: default and uvloop.
aioodbc should work with all databases supported by pyodbc. But for now library have been tested with: SQLite, MySQL and PostgreSQL. Feel free to add other databases to the test suite by submitting PR.
Mailing List: https://groups.google.com/forum/#!forum/aio-libs
Chat room: https://gitter.im/aio-libs/Lobby
aioodbc based on pyodbc , and provides same api, you just need
to use yield from conn.f()
or await conn.f()
instead of just
call conn.f()
for every method.
Properties are unchanged, so conn.prop
is correct as well as
conn.prop = val
.
import asyncio
import aioodbc
loop = asyncio.get_event_loop()
async def test_example():
dsn = 'Driver=SQLite;Database=sqlite.db'
conn = await aioodbc.connect(dsn=dsn, loop=loop)
cur = await conn.cursor()
await cur.execute("SELECT 42;")
r = await cur.fetchall()
print(r)
await cur.close()
await conn.close()
loop.run_until_complete(test_example())
Connection pooling ported from aiopg and rely on PEP492 features:
import asyncio
import aioodbc
loop = asyncio.get_event_loop()
async def test_pool():
dsn = 'Driver=SQLite;Database=sqlite.db'
pool = await aioodbc.create_pool(dsn=dsn, loop=loop)
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()
loop.run_until_complete(test_example())
Pool, Connection and Cursor objects support context manager protocol:
import asyncio
import aioodbc
loop = asyncio.get_event_loop()
async def test_example():
dsn = 'Driver=SQLite;Database=sqlite.db'
async with aioodbc.create_pool(dsn=dsn, loop=loop) as pool:
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute('SELECT 42;')
val = await cur.fetchone()
print(val)
loop.run_until_complete(test_example())
In Linux environment pyodbc (hence aioodbc) requires unixODBC library. You can install it using package manager from your OS distribution, for example:
$ sudo apt-get install unixodbc $ sudo apt-get install unixodbc-dev
then:
pip install aioodbc
For testing purposes you need to install docker and development requirements:
$ pip install -r requirements-dev.txt
In order to simplify development all tests and environment created inside separate docker image, you do not need to install any database of system level libraries, everything happens automatically inside container.
Then just execute:
$ make docker_build $ make docker_test
Test will automatically pull images and build containers with required databases.
NOTE: Running tests requires Python 3.6 or higher.