Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DRAFT] SA20: Add compatibility adapters for psycopg3 and asyncpg dialects #532

Closed
wants to merge 2 commits into from

Conversation

amotl
Copy link
Member

@amotl amotl commented Mar 4, 2023

About

The idea is to unlock the CrateDB dialect for SQLAlchemy with the psycopg3 and asyncpg drivers by introducing corresponding crate+psycopg://, crate+asyncpg://, and crate+urllib3:// dialect identifiers.

The asynchronous variant of psycopg is also supported and will be automatically selected when using create_async_engine() instead of create_engine().

Installation

git clone https://github.com/crate/crate-python --branch=amo/postgresql-async
cd crate-python
python3 -m venv .venv
source .venv/bin/activate
pip install --editable='.[postgresql,sqlalchemy]'

Examples

Those example programs exercise basic conversations using the specified drivers.

python examples/sync_table.py urllib3 psycopg
python examples/async_table.py psycopg asyncpg
python examples/async_streaming.py psycopg asyncpg

References

@amotl
Copy link
Member Author

amotl commented Mar 4, 2023

Backlog

1. Missing test cases

C'est la vie. Please use the provided example programs until we have them.

2. Still using PGDDLCompiler

There is more work to do, to make the hybrid dialect use the CrateDDLCompiler instead of the PGDDLCompiler. Otherwise, when defining a column with autoincrement=True, it will obviously croak, because it will render the SERIAL type, which CrateDB does not understand.

sa.Column("x", sa.Integer, primary_key=True, autoincrement=True)
CREATE TABLE testdrive (
	x SERIAL NOT NULL,
	y INT,
	PRIMARY KEY (x)
)
sqlalchemy.exc.InternalError: (psycopg.errors.InternalError_) Cannot find data type: serial

3. Error Cannot find portal: c_10479c0a0_1 with psycopg3

This flaw has been observed with the psycopg driver in asynchronous mode when using result streaming based on server-side cursors. It can be exercised using the async_streaming.py example program.

python examples/async_streaming.py psycopg

The same program works fine when using the asyncpg driver.

python examples/async_streaming.py asyncpg

Introduction

About
=====
Example program to demonstrate how to connect to CrateDB using its SQLAlchemy
dialect, and exercise a few basic examples using the low-level table API, this
time in asynchronous mode.
Specific to the asynchronous mode of SQLAlchemy is the streaming of results:
> The `AsyncConnection` also features a "streaming" API via the `AsyncConnection.stream()`
> method that returns an `AsyncResult` object. This result object uses a server-side cursor
> and provides an async/await API, such as an async iterator.
>
> -- https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html#synopsis-core

Bug

Bugs
====
When using the `psycopg` driver, the program currently croaks like::
sqlalchemy.exc.InternalError: (psycopg.errors.InternalError_) Cannot find portal: c_10479c0a0_1

References

@amotl amotl changed the title [DRAFT] SA20: Add compatibility adapter for psycopg and asyncpg dialects [DRAFT] SA20: Add compatibility adapters for psycopg3 and asyncpg dialects Mar 4, 2023
@amotl
Copy link
Member Author

amotl commented Dec 23, 2023

@amotl amotl closed this Dec 23, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant