Abstract implementation of the DB 2.0 API outlined in PEP-249.
Project description
An Abstract PEP-249 Implementation
This library contains an abstract implementation of PEP-249 which should make it easier to implement new databases in Python. These abstract implementations are fully typed and the docstrings contain some (plagiarised) information from the standard. There is a basic async implementation which could probably be improved upon.
To demonstrate usage of this library, I'm putting together a wrapper on top of the
excellent DuckDB library which adds full typing, context managers,
distinct cursors, and easier to manage error types. This wrapper is available here,
and is currently a bit rough around the edges. It contains a naive async implementation
which essentially just wraps every call with asyncio.to_thread
.
Tested in Python 3.7, but not extensively. This library has not been condoned by the PEP authors, who might hate it.
Why would I use this?
If you're looking to implement a DB-API 2.0 interface for a database, this library should make it easier to do so. Inheriting from the appropriate abstract base classes will ensure that classes can't be instantiated without fully implementing the required behaviour. Implementations will be fully typed, and some functionality is provided 'for free' (e.g. context managers, cursor iteration).
Installation
python3 -mpip install pep249abc
Usage
This library's base classes define a protocol which requires implementation. If you inherit from these classes, your editor should whinge at you until you've implemented the rest of the specification (or if you deviate from it).
import pep249
class Cursor(pep249.Cursor):
...
class Connection(pep249.Connection):
...
To use the mixin types (e.g. to implement extensions, or to implement execute*()
for
the Connection
), use multiple inheritance:
import pep249
class Connection(
pep249.CursorExecuteMixin, pep249.ConcreteErrorMixin, pep249.Connection
):
...
The async implementation is contained in a separate subpackage:
from pep249 import aiopep249
class AsyncConnection(
aiopep249.AsyncCursorExecuteMixin,
aiopep249.ConcreteErrorMixin,
aiopep249.AsyncConnection,
):
...
What has been implemented?
All of the core functionality, some 'common but slightly non-compliant' stuff (e.g.
TransactionalCursor
, a Cursor
with transaction support), and some select extensions:
- A mixin to add the error types to the
Connection
. - A mixin to add a reference to the
Connection
to theCursor
. - A mixin to add support for next and iteration.
There is now a very basic async implementation, which was made by copy and pasting the synchronous
implementation and sprinking the words async
and await
in some appropriate (and likely some
inappropriate) places.
What has not been implemented?
Most of the optional extensions.
Cursor.rownumber
.Cursor.scroll()
.Cursor.messages
.Connection.messages
.Cursor.lastrowid
.Cursor/Connection.errorhandler
.- Two phase commit extensions.
Most of these are missing simply because I haven't encountered them in the wild and they weren't supported by the reference implementation I had in mind. If you'd like to see these implemented, please raise an issue! If you have examples of the features in use, that would be helpful.
What could be improved?
Probably a lot! In particular, I'm not happy with Cursor.description
or the type
constructors. The spec is quite opaque on these and I haven't done much research on how
these work or how they should tie in.
What are the future plans?
General improvements, some further testing, some documentation, and maybe a more inspired async implementation which more commonly mirrors aiosqlite.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file pep249abc-0.0.1b2-py3-none-any.whl
.
File metadata
- Download URL: pep249abc-0.0.1b2-py3-none-any.whl
- Upload date:
- Size: 18.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.7.0 requests/2.24.0 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.7.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | aadcc2a2db645d2bee3add6d0509296b048cd41aa712e589b85d1aa45e397e13 |
|
MD5 | 0b75496a970ace3d28e3d517eb91b929 |
|
BLAKE2b-256 | 59d8e505ddf38ebdb95497eb1e527f6f3fac99fef71cfaeb5801c281e455b0b4 |