cx_Oracle_async

A very simple asynchronous wrapper that allows you to get access to the Oracle database in asyncio programs.

38
16
Python

cx_Oracle_async

fury
licence
pyversions
Publish
Build
Docs
Visitors

A very simple asynchronous wrapper that allows you to get access to the Oracle database in asyncio programs.

Easy to use , buy may not the best practice for efficiency concern.

About development release

In parallel with the main branch, we have worked on a development version based on SQLAlchemy’s thread pool management facilities, please refer to Development notes for details.

Requirements

  • cx_Oracle >= 8.1.0 (Take into consideration that author of cx_Oracle said he’s trying to implement asyncio support , APIs maybe change in future version. Switch to 8.1.0 if there’s something wrong makes it not gonna work.)
  • ThreadPoolExecutorPlus >= 0.2.0

Install

pip install cx_Oracle_async

Feature

  • Nearly all the same as aiomysql in asynchronous operational approach , with limited cx_Oracle feature support.
  • No automaticly date format transition built-in.
  • AQ feature added , check docs here for further information.
  • You can modify some of the connection properties simply like you’re using cx_Oracle.
  • You can do basic insert / select / delete etc.
  • If you’re connecting to database which is on a different machine from python process , you need to install oracle client module in order to use this library. Check cx-Oracle’s installation guide for further information.

Documentation

https://cx_oracle_async.readthedocs.io

Performance

query type asynchronous multithreading synchronous multithreading synchronous single thread
fast single line query 6259.80 q/s 28906.93 q/s 14805.61 q/s
single line insertion 1341.88 q/s 1898 q/s 1685.17 q/s

/* Test platform: */

AMD Ryzen 3700x

Windows 10 LTSC

Oracle 19c

You can find performance test codes here.

Examples

Before running examples , make sure you’ve already installed a Oracle Client on your machine.

# basic_usages.py
import asyncio
import cx_Oracle_async

async def main():
    oracle_pool = await cx_Oracle_async.create_pool(
        host='localhost', 
        port='1521',
        user='user', 
        password='password',
        service_name='orcl', 
        min = 2,
        max = 4,
    )

    async with oracle_pool.acquire() as connection:
        async with connection.cursor() as cursor:
            await cursor.execute("SELECT * FROM V$SESSION")
            print(await cursor.fetchall())

    await oracle_pool.close()

if __name__ == '__main__':
    asyncio.run(main())