DBAPI совместимость для sync picopyn
Необходимо свериться с DBAPI и провести ревизию ручек, выделить апи на поддержку и поддержать всё необходимое. Может показаться, что некоторые части API не получится поддержать для пикодаты из-за отсутствия поддержки некоторого функционала, но DBAPI описывает клиентский интерфейс, поэтому совместимость может быть обеспечена на уровне драйвера -- см ниже.
Cursor
Например, важной частью DBAPI является объект cursor. Это не серверный курсор, поэтому отсутствие поддержки курсоров в пикодате нам не помешает. Cursor это хендлер запроса, который хранит
- последний выполненный запрос
- результат запроса, текущее место чтения (в нашем случае это всегда все строки, возвращаемые запросом)
- параметры, метадата
То есть наш 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)