Asynchronous interface for peewee ORM powered by asyncio

Overview

peewee-async

Asynchronous interface for peewee ORM powered by asyncio.

Build Status PyPi Version Documentation Status

Important notes

  • Since version 0.6.0a only peewee 3.5+ is supported
  • If you still need Python 3.4 support use older versions, i.e. pip install peewee-async==0.5.12

Version 0.6.0a is published as pre-release, mind the "a" in version identifier. That means in order to install it you should specify --pre flag for pip.

Overview

  • Requires Python 3.5+
  • Has support for PostgreSQL via aiopg
  • Has support for MySQL via aiomysql
  • Single point for high-level async API
  • Drop-in replacement for sync code, sync will remain sync
  • Basic operations are supported
  • Transactions support is present, yet not heavily tested

The complete documentation:
http://peewee-async.readthedocs.io

Install

Install with pip for PostgreSQL:

pip install --pre peewee-async; pip install aiopg

or for MySQL:

pip install --pre peewee-async; pip install aiomysql

Quickstart

Create 'test' PostgreSQL database for running this snippet:

createdb -E utf-8 test

The code below is using new Python 3.5 async / await syntax, but older yield from will also work!

import asyncio
import peewee
import peewee_async

# Nothing special, just define model and database:

database = peewee_async.PostgresqlDatabase(
    database='db_name',
    user='user',
    host='127.0.0.1',
    port='5432',
    password='password'
)

class TestModel(peewee.Model):
    text = peewee.CharField()

    class Meta:
        database = database

# Look, sync code is working!

TestModel.create_table(True)
TestModel.create(text="Yo, I can do it sync!")
database.close()

# Create async models manager:

objects = peewee_async.Manager(database)

# No need for sync anymore!

database.set_allow_sync(False)

async def handler():
    await objects.create(TestModel, text="Not bad. Watch this, I'm async!")
    all_objects = await objects.execute(TestModel.select())
    for obj in all_objects:
        print(obj.text)

loop = asyncio.get_event_loop()
loop.run_until_complete(handler())
loop.close()

# Clean up, can do it sync again:
with objects.allow_sync():
    TestModel.drop_table(True)

# Expected output:
# Yo, I can do it sync!
# Not bad. Watch this, I'm async!

Documentation

http://peewee-async.readthedocs.io

Discuss

You are welcome to add discussion topics or bug reports to tracker on GitHub: https://github.com/05bit/peewee-async/issues

License

Copyright (c) 2014, Alexey Kinev [email protected]

Licensed under The MIT License (MIT), see LICENSE file for more details.

Comments
  • concurent queries

    concurent queries

    Peewee recomends to conect() just before request and close() after executing user code.

    i.e. from documentation: http://docs.peewee-orm.com/en/latest/peewee/database.html#creating-a-database-connection-and-tables

    database = SqliteDatabase('my_app.db')
    
    def before_request_handler():
        database.connect()
    
    def after_request_handler():
        database.close()
    

    On async app handlers are coroitines and requests can be processed while another one waiting bigger data.

    Is there way to get another connection from pool and do requsts on it instead of using shared database connection?

    Context manager maybe?

    related #53

    opened by alex-eri 12
  • Fix #66 - No way to pass timeout to database

    Fix #66 - No way to pass timeout to database

    Added timeout to async database connections through the connect_kwargs dict The timeout is pulled from the connection parameters if specified therein, otherwise the default timeout is used.

    opened by roansong 10
  • Unable to make use of atomic requests in tests

    Unable to make use of atomic requests in tests

    I have been trying to get a test setup working, similar to the way Django will wrap every test in an atomic transaction in order to do a rollback after the test has finished.

    Everything seems to work fine if I only have one test, but the moment I add a second one I get the following error.

    self = <peewee_async.transaction object at 0x10a6e5668>
    
        @asyncio.coroutine
        def __aenter__(self):
            if not asyncio.Task.current_task(loop=self.loop):
    >           raise RuntimeError("The transaction must run within a task")
    E           RuntimeError: The transaction must run within a task
    
    venv/lib/python3.6/site-packages/peewee_async.py:1436: RuntimeError
    

    I am unable to figure out why this is happening and what I am doing wrong. I have created a test project. Any guidance would be greatly appreciated.

    https://github.com/cburger/peewee-async-test

    opened by cburza 7
  • Support Models without specified database

    Support Models without specified database

    Currently when you define a model and don't define the database meta on models (but still pass the proper database instance to peewee_async.Manager), peewee-async crashes when executing a query:

    "Error, models's database and manager's are different: %s" % model
    

    This can be hacked around like this (assuming the database is postgres):

    class MyModel(peewee.Model):
        class Meta:
            # peewee-async insists on "compatible" database
            database = peewee.PostgresqlDatabase(None)
    

    But why the limitation in the first place? I understand that if the model database meta was specified and it was different from what is then passed to peewee_async.Manager, the compatibility check would make sense. But if a user will never use the non-async way, and never specified the database meta, this check is not needed. Please remove it for that case.

    Having the "global" database object is an anti-pattern anyway.

    opened by IlyaSemenov 6
  • Transactions support

    Transactions support

    Hi, it's a great project - finally I can use normal DB with asyncio. However it seems that transactions doesn't work:

        object = await peewee_async.create_object(TestModel, text="FOO")
        obj_id = object.id
        try:
            with database.atomic() as txn:
                object.text = "BAR"
                print(await peewee_async.update_object(object))
                raise AttributeError("AAAA")
    
        except AttributeError as e:
            object = await peewee_async.get_object(TestModel, TestModel.id==obj_id)
            print("TEXT:", object.text)
    

    gives

    1
    TEXT: BAR
    

    At the moment I have no clue, how could I fix this by myself- if you could give me some hints, I'll be more than happy to contribute.

    opened by mrbox 6
  • An example about using peewee-async with Tornado

    An example about using peewee-async with Tornado

    I spent several hours to find how can peewee-async and Tornado work together. And finally I got this: https://gist.github.com/anjianshi/0cfb8bee7d7e8a7dd9c6

    It seems working. But is it the right way to use them? May be you can add an example in documents, to help people that not familiar with asyncio or Tornado?

    Thank you!

    opened by anjianshi 6
  • Help! KeyError: 'A@>' when using ArrayField

    Help! KeyError: 'A@>' when using ArrayField

    Query

            lobbies = await db.execute(Lobby.select().where(
                (Lobby.members.contains(user['steam_id'])) & (Lobby.id != lobby_id))
            )
    

    Model

    class Lobby(BaseModel):
        members = ArrayField(CharField, default=list)
    

    Error

    2017-03-14 00:10:22,513: ERROR: Traceback (most recent call last):                                                                                 W5pYy9saWIvcHl0aG9uMy42L3NpdGUtcGFja2FnZ  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/sanic/app.py", line 391, in handle_request                                  L3B1Zy9hcHAvdXRpbHMucHkiLCBsaW5lIDk2LCBp    response = await response                                                                                                                      2aWV3cy9sb2JieS5weSIsIGxpbmUgNTUsIGluIGF  File "/home/qwexvf/Documents/work/pug/app/utils.py", line 96, in decorated_function                                                              dleHZmLy5weWVudi92ZXJzaW9ucy9zYW5pYy9saW    response = await f(req, *args, **kwargs)                                                                                                       CIvaG9tZS9xd2V4dmYvLnB5ZW52L3ZlcnNpb25zL  File "/home/qwexvf/Documents/work/pug/app/views/lobby.py", line 55, in api_lobby_info                                                            eSkpCiAgRmlsZSAiL2hvbWUvcXdleHZmLy5weWVu    lobbies = await db.execute(Lobby.select().where((Lobby.members.contains())))                                                                   lY3V0ZV9xdWVyeV9hc3luYyhxdWVyeSkKICBGaWx  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee_async.py", line 269, in execute                                      J5X2FzeW5jCiAgICByZXR1cm4gKHlpZWxkIGZyb2    return (yield from execute(query))                                                                                                             XMvcGVld2VlLnB5IiwgbGluZSAzMTc0LCBpbiBzc  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee_async.py", line 433, in execute                                      dGUtcGFja2FnZXMvcGVld2VlLnB5IiwgbGluZSAx    return (yield from coroutine(query))                                                                                                           hbmljL2xpYi9weXRob24zLjYvc2l0ZS1wYWNrYWd  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee_async.py", line 574, in select                                       9xd2V4dmYvLnB5ZW52L3ZlcnNpb25zL3NhbmljL2    cursor = yield from _execute_query_async(query)                                                                                                WxpYXNfbWFwLCBjb252KQogIEZpbGUgIi9ob21lL  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee_async.py", line 1518, in _execute_query_async                        bGYuX3BhcnNlX21hcFtub2RlX3R5cGVdKG5vZGUs    return (yield from _run_sql(query.database, *query.sql()))                                                                                     sIGluIF9wYXJzZV9jbGF1c2UKICAgIG5vZGUubm9  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 3174, in sql                                               5weSIsIGxpbmUgMTg2MywgaW4gcGFyc2Vfbm9kZV    return self.compiler().generate_select(self)                                                                                                   2FuaWMvbGliL3B5dGhvbjMuNi9zaXRlLXBhY2thZ  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1999, in generate_select                                   L2hvbWUvcXdleHZmLy5weWVudi92ZXJzaW9ucy9z    return self.build_query(clauses, alias_map)                                                                                                    obm9kZSwgYWxpYXNfbWFwLCBjb252KQogIEZpbGU  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1885, in build_query                                       AgIHNxbCA9IHRlbXBsYXRlICUgKGxocywgc2VsZi    return self.parse_node(Clause(*clauses), alias_map)                                                                                            DE2OTQsIGluIGdldF9vcAogICAgcmV0dXJuIHNlb  File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1838, in parse_node                                        │                                       
        sql, params, unknown = self._parse(node, alias_map, conv)                                                                                      │                                       
      File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1804, in _parse                                            │                                       
        sql, params = self._parse_map[node_type](node, alias_map, conv)                                                                                │                                       
      File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1735, in _parse_clause                                     │                                       
        node.nodes, alias_map, conv, node.glue)                                                                                                        │                                       
      File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1863, in parse_node_list                                   │                                       
        node_sql, node_params = self.parse_node(node, alias_map, conv)                                                                                 │                                       
      File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1838, in parse_node                                        │                                       
        sql, params, unknown = self._parse(node, alias_map, conv)                                                                                      │                                       
      File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1804, in _parse                                            │                                       
        sql, params = self._parse_map[node_type](node, alias_map, conv)                                                                                │                                       
      File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1710, in _parse_expression                                 │                                       
        sql = template % (lhs, self.get_op(node.op), rhs)                                                                                              │                                       
      File "/home/qwexvf/.pyenv/versions/sanic/lib/python3.6/site-packages/peewee.py", line 1694, in get_op                                            │                                       
        return self._op_map[q]                                                                                                                         │                                       
    KeyError: 'A@>'     
    

    i think the problem is with (Lobby.members.contains(user['steam_id']) if so how can i deal with arrayfield?

    opened by qwexvf 5
  • Updated peewee version

    Updated peewee version

    In peewee==2.8.5 database.exception_wrapper is not callable, so in _run_sql we also should use it without parentheses, instead it would raise runtime exception.

    opened by kammala 5
  • Playhouse support

    Playhouse support

    Now peewee_async.PostgresqlDatabase inherits from peewee.PostgresqlDatabase so we cannot use async-peewee and playhouse extensions for PostgreSql (it requires PostgresqlExtDatabase from playhouse.postgres_ext) together.

    opened by horpto 5
  • How the hell join() works for table with multiple same FK?

    How the hell join() works for table with multiple same FK?

    Hey, I have a problem. How am I supposed to do join() with model like this (just a pseudocode):

    class User():
        ....
    
    class Offer():
        user1 = model.User()
        user2 = model.User()
        user3 = model.User()
    
    off = await appl.execute(Offer.select().join(User, on=(User.id==Offer.user1)))
    for o in off:
        print(o.user1)
    

    (from here) I tried literally all options but I am still getting:

    AssertionError: Error, sync query is not allowed! Call the `.set_allow_sync()` or use the `.allow_sync()` context manager.
    500 POST /offers/sgn (::1) 62.84ms
    

    This is working when: I remove user2 and user3 fields, or when not run with tornado unittests (then it works even with user2 and user3 fields). Maybe it was bad idea to go with async.

    opened by xplsek03 4
  • Type error when using on_conflict_ignore clause

    Type error when using on_conflict_ignore clause

    I'm getting TypeError with on_conflict_ignore clause (http://docs.peewee-orm.com/en/latest/peewee/api.html#Insert.on_conflict_ignore) peewee-async==0.6.3a0

    File "commands.py", line 26, in main
        await db.execute(models.FtpArchive.insert_many(archives).on_conflict_ignore())
      File ".virtualenvs/goszakupki-NLfZGmx3/lib/python3.7/site-packages/peewee_async.py", line 270, in execute
        return (await execute(query))
      File ".virtualenvs/goszakupki-NLfZGmx3/lib/python3.7/site-packages/peewee_async.py", line 430, in execute
        return (await coroutine(query))
      File ".virtualenvs/goszakupki-NLfZGmx3/lib/python3.7/site-packages/peewee_async.py", line 596, in insert
        result = row[0]
    TypeError: 'NoneType' object is not subscriptable
    
    opened by qweeze 4
  • Allow the release function to be a coroutine

    Allow the release function to be a coroutine

    Third-party modules (SQLite support, at the moment) rely on an asynchronous release call, native DB interfaces don't.

    This PR ensures the proper type of call is fired.

    opened by gdassori 0
  • Update docs for connect to database with ssl

    Update docs for connect to database with ssl

    Hi, I didn't find the related doc about connect with ssl in peewee-async and the method in peewee is not working. So I made some effort to figure it out. Could you please update it to the documents? It could be useful to people who's going to use database like PlanetScale.

    You can see I created two testing scripts below, one is using dict for ssl, the other is using ssl.SSLContext.

    ssl_connect

    If I run test_ssl.py which uses dict for ssl, it will cause error:

    python spiders/test_ssl.py
    /home/dlwxxxdlw/codes/jackdeng/eastmoney/spiders/test_ssl.py:24: DeprecationWarning: There is no current event loop
      loop = asyncio.get_event_loop()
    SSL handshake failed
    protocol: <asyncio.sslproto.SSLProtocol object at 0x7f47f457ae60>
    transport: <_SelectorSocketTransport fd=7 read=idle write=<idle, bufsize=0>>
    Traceback (most recent call last):
      File "/usr/lib/python3.10/asyncio/sslproto.py", line 637, in _on_handshake_complete
        raise handshake_exc
      File "/usr/lib/python3.10/asyncio/sslproto.py", line 682, in _process_write_backlog
        ssldata = self._sslpipe.do_handshake(
      File "/usr/lib/python3.10/asyncio/sslproto.py", line 116, in do_handshake
        self._sslobj = self._context.wrap_bio(
    AttributeError: 'dict' object has no attribute 'wrap_bio'
    Future exception was never retrieved
    future: <Future finished exception=OperationalError(2003, "Can't connect to MySQL server on ''")>
    Traceback (most recent call last):
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/aiomysql/connection.py", line 540, in _connect
        await self._request_authentication()
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/aiomysql/connection.py", line 758, in _request_authentication
        self._reader, self._writer = await _open_connection(
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/aiomysql/connection.py", line 88, in _open_connection
        transport, _ = await loop.create_connection(
      File "/usr/lib/python3.10/asyncio/base_events.py", line 1089, in create_connection
        transport, protocol = await self._create_connection_transport(
      File "/usr/lib/python3.10/asyncio/base_events.py", line 1119, in _create_connection_transport
        await waiter
      File "/usr/lib/python3.10/asyncio/sslproto.py", line 637, in _on_handshake_complete
        raise handshake_exc
      File "/usr/lib/python3.10/asyncio/sslproto.py", line 682, in _process_write_backlog
        ssldata = self._sslpipe.do_handshake(
      File "/usr/lib/python3.10/asyncio/sslproto.py", line 116, in do_handshake
        self._sslobj = self._context.wrap_bio(
    AttributeError: 'dict' object has no attribute 'wrap_bio'
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/peewee_async.py", line 868, in connect_async
        await conn.connect()
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/peewee_async.py", line 1195, in connect
        self.pool = await aiomysql.create_pool(
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/aiomysql/pool.py", line 29, in _create_pool
        await pool._fill_free_pool(False)
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/aiomysql/pool.py", line 182, in _fill_free_pool
        conn = await connect(echo=self._echo, loop=self._loop,
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/aiomysql/connection.py", line 75, in _connect
        await conn._connect()
      File "/home/dlwxxxdlw/.cache/pypoetry/virtualenvs/eastmoney-UoyfY-mu-py3.10/lib/python3.10/site-packages/aiomysql/connection.py", line 558, in _connect
        raise OperationalError(2003,
    pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on ''")
    Failed with dict value for ssl params.
    (2003, "Can't connect to MySQL server on ''")
    
    

    But if I run test_ssl_2.py which uses ssl.SSLContext and it will work:

    python spiders/test_ssl_2.py
    /home/dlwxxxdlw/codes/jackdeng/eastmoney/spiders/test_ssl_2.py:7: DeprecationWarning: ssl.PROTOCOL_TLS is deprecated
      ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
    /home/dlwxxxdlw/codes/jackdeng/eastmoney/spiders/test_ssl_2.py:29: DeprecationWarning: There is no current event loop
      loop = asyncio.get_event_loop()
    objects amount: 231
    Success connect to planetscale with ssl.SSLContext
    
    opened by JackTheMico 0
  • manual set prefetch target model

    manual set prefetch target model

    peewee prefetch_add_subquery support manual set target model

    prefetch_queries=[User.select()]  # old
    
    prefetch_queries=[(User.select(), Document)]  # now support, manual set target model 
    
    opened by gshmu 0
  • 2 methods migrated directly from original peewee

    2 methods migrated directly from original peewee

    Added method first() as it has better performance with big tables comparing to get() method because it doesn't query all data from table

    Added method get_or_none() which is more useful than handling exceptions in some situations

    opened by pylakey 0
Owner
05Bit
Our open sourced libs we use in production. You are welcome to use and contribute too!
05Bit
Familiar asyncio ORM for python, built with relations in mind

Tortoise ORM Introduction Tortoise ORM is an easy-to-use asyncio ORM (Object Relational Mapper) inspired by Django. Tortoise ORM was build with relati

Tortoise 3.3k Dec 31, 2022
a small, expressive orm -- supports postgresql, mysql and sqlite

peewee Peewee is a simple and small ORM. It has few (but expressive) concepts, making it easy to learn and intuitive to use. a small, expressive ORM p

Charles Leifer 9.7k Dec 30, 2022
Async ORM based on PyPika

PyPika-ORM - ORM for PyPika SQL Query Builder The package gives you ORM for PyPika with asycio support for a range of databases (SQLite, PostgreSQL, M

Kirill Klenov 7 Jun 4, 2022
Motor - the async Python driver for MongoDB and Tornado or asyncio

Motor Info: Motor is a full-featured, non-blocking MongoDB driver for Python Tornado and asyncio applications. Documentation: Available at motor.readt

mongodb 2.1k Dec 26, 2022
A fast PostgreSQL Database Client Library for Python/asyncio.

asyncpg -- A fast PostgreSQL Database Client Library for Python/asyncio asyncpg is a database interface library designed specifically for PostgreSQL a

magicstack 5.8k Dec 31, 2022
aiopg is a library for accessing a PostgreSQL database from the asyncio

aiopg aiopg is a library for accessing a PostgreSQL database from the asyncio (PEP-3156/tulip) framework. It wraps asynchronous features of the Psycop

aio-libs 1.3k Jan 3, 2023
aiomysql is a library for accessing a MySQL database from the asyncio

aiomysql aiomysql is a "driver" for accessing a MySQL database from the asyncio (PEP-3156/tulip) framework. It depends on and reuses most parts of PyM

aio-libs 1.5k Jan 3, 2023
aioodbc - is a library for accessing a ODBC databases from the asyncio

aioodbc aioodbc is a Python 3.5+ module that makes it possible to access ODBC databases with asyncio. It relies on the awesome pyodbc library and pres

aio-libs 253 Dec 31, 2022
Motor - the async Python driver for MongoDB and Tornado or asyncio

Motor Info: Motor is a full-featured, non-blocking MongoDB driver for Python Tornado and asyncio applications. Documentation: Available at motor.readt

mongodb 1.6k Feb 6, 2021
asyncio (PEP 3156) Redis support

aioredis asyncio (PEP 3156) Redis client library. Features hiredis parser Yes Pure-python parser Yes Low-level & High-level APIs Yes Connections Pool

aio-libs 2.2k Jan 4, 2023
Redis client for Python asyncio (PEP 3156)

Redis client for Python asyncio. Redis client for the PEP 3156 Python event loop. This Redis library is a completely asynchronous, non-blocking client

Jonathan Slenders 554 Dec 4, 2022
CouchDB client built on top of aiohttp (asyncio)

aiocouchdb source: https://github.com/aio-libs/aiocouchdb documentation: http://aiocouchdb.readthedocs.org/en/latest/ license: BSD CouchDB client buil

aio-libs 53 Apr 5, 2022
asyncio compatible driver for elasticsearch

asyncio client library for elasticsearch aioes is a asyncio compatible library for working with Elasticsearch The project is abandoned aioes is not su

null 97 Sep 5, 2022
An asyncio compatible Redis driver, written purely in Python. This is really just a pet-project for me.

asyncredis An asyncio compatible Redis driver. Just a pet-project. Information asyncredis is, like I've said above, just a pet-project for me. I reall

Vish M 1 Dec 25, 2021
Asynchronous Python client for InfluxDB

aioinflux Asynchronous Python client for InfluxDB. Built on top of aiohttp and asyncio. Aioinflux is an alternative to the official InfluxDB Python cl

Gustavo Bezerra 159 Dec 27, 2022
Asynchronous, fast, pythonic DynamoDB Client

AsyncIO DynamoDB Asynchronous pythonic DynamoDB client; 2x faster than aiobotocore/boto3/botocore. Quick start With httpx Install this library pip ins

HENNGE 48 Dec 18, 2022
ClickHouse Python Driver with native interface support

ClickHouse Python Driver ClickHouse Python Driver with native (TCP) interface support. Asynchronous wrapper is available here: https://github.com/myma

Marilyn System 957 Dec 30, 2022
A pythonic interface to Amazon's DynamoDB

PynamoDB A Pythonic interface for Amazon's DynamoDB. DynamoDB is a great NoSQL service provided by Amazon, but the API is verbose. PynamoDB presents y

null 2.1k Dec 30, 2022
Python interface to Oracle Database conforming to the Python DB API 2.0 specification.

cx_Oracle version 8.2 (Development) cx_Oracle is a Python extension module that enables access to Oracle Database. It conforms to the Python database

Oracle 841 Dec 21, 2022