ydb-python-sdk
ydb-python-sdk copied to clipboard
Автоматическая конвертация типов
Очень полезным было бы осуществлять конверсию типов в/из нативные питоновские при чтении/вставке в БД.
- JsonField передавать не строкой а структурой данных (list/dict)
- понимать Datetime вместо секунд
- и.т.п.
Use-case:
Использую Pydantic для сериализации/десериализации и валидации данных при работе с API Gateway (это вдвойне необходимо, т.к. AGW вообще не валидирует типы параметров). Вызов pydantic.MyModel.parse_obj(resultset[0].rows[0])
не проходит валидацию из-за несоответствия типов. Приходится писать json.dumps(...)
при записи поля в базу, и дополнительный валидатор на поле модели делающий json.loads(...)
.
Это частично поддерживается. Можно настроить драйвер так, чтобы в result sets были нативные типы. См. https://github.com/ydb-platform/ydb-python-sdk/blob/main/tests/aio/test_types.py#L78 как пример. Вместо datetime можно использовать timestamp. Тогда можно будет указывать в параметрах datetime.datetime. См. https://github.com/ydb-platform/ydb-python-sdk/blob/main/tests/aio/test_types.py#L67 Передавать json прямо сейчас dict-ом не получится, т.к. он сейчас мапится в Dict<..> https://github.com/ydb-platform/ydb-python-sdk/blob/main/tests/aio/test_types.py#L34. Вероятно это стоило бы поменять.
Поскольку все примеры кода используют ydb.Driver()
а не ydb.TableClient()
как в приведённом вами тесте, пришлось немного покопаться как прокинуть эти настройки. Получилось так:
self.driver = ydb.Driver(
driver_config = ydb.DriverConfig(
endpoint=os.getenv("YDB_ENDPOINT"),
database=os.getenv("YDB_DATABASE"),
credentials=ydb.credentials_from_env_variables(),
table_client_settings = ydb.TableClientSettings()
.with_native_date_in_result_sets(True)
.with_native_datetime_in_result_sets(True)
.with_native_timestamp_in_result_sets(True)
.with_native_interval_in_result_sets(True)
.with_native_json_in_result_sets(True)
)
)