DBAPI совместимость для sync picopyn

Необходимо свериться с DBAPI и провести ревизию ручек, выделить апи на поддержку и поддержать всё необходимое. Может показаться, что некоторые части API не получится поддержать для пикодаты из-за отсутствия поддержки некоторого функционала, но DBAPI описывает клиентский интерфейс, поэтому совместимость может быть обеспечена на уровне драйвера -- см ниже.

Cursor

Например, важной частью DBAPI является объект cursor. Это не серверный курсор, поэтому отсутствие поддержки курсоров в пикодате нам не помешает. Cursor это хендлер запроса, который хранит

  1. последний выполненный запрос
  2. результат запроса, текущее место чтения (в нашем случае это всегда все строки, возвращаемые запросом)
  3. параметры, метадата

То есть наш Cursor будет весь результат держать у себя в памяти

Transactions

Касательно ручек commit/rollback спецификация позволяет полноценно имплементировать данные ручки для баз данных с поддержкой транзакций. Для иных случаев (пикодата) PEP 249 допускает выброс NotSupportedError для неподдерживаемых операций транзакций.

При этом, на практике commit() часто автоматически вызывается ORM и другими инструментами, поэтому имеет смысл отдельно проверить ожидаемое поведение SQLAlchemy и, возможно, реализовать commit() как no-op для лучшей совместимости.

class Connection:
    def commit(self):
        pass
    # OR
    # def commit(self):
        # # no-op
        # return None

    def rollback(self):
        raise NotSupportedError(
            "Picodata does not support transactions"
        )

Необходимо проверить поведение в этой части SQLAlchemy

Атрибуты

Для DBAPI совместимости необходимо также поработать с атрибутами, особенно paramstyle. Нужно отметить, что asyncpg-style (WHERE id = $1 etc) параметры не входят в DBAPI paramstyle.

Стоит проверить, что Пикодата сможет работать с параметризацией DBAPI, определить, какие конкретно стили мы можем поддержать и оставить, а также хотим ли как-то прокидывать дополнительный стиль, чтобы оставить совместимость с asyncpg-style (поможет безболезненно переключаться между sync и async)

Edited by Asya Lomakina