ydb-python-sdk icon indicating copy to clipboard operation
ydb-python-sdk copied to clipboard

Автоматическая конвертация типов

Open max-arnold opened this issue 2 years ago • 2 comments

Очень полезным было бы осуществлять конверсию типов в/из нативные питоновские при чтении/вставке в БД.

  • JsonField передавать не строкой а структурой данных (list/dict)
  • понимать Datetime вместо секунд
  • и.т.п.

Use-case:

Использую Pydantic для сериализации/десериализации и валидации данных при работе с API Gateway (это вдвойне необходимо, т.к. AGW вообще не валидирует типы параметров). Вызов pydantic.MyModel.parse_obj(resultset[0].rows[0]) не проходит валидацию из-за несоответствия типов. Приходится писать json.dumps(...) при записи поля в базу, и дополнительный валидатор на поле модели делающий json.loads(...).

max-arnold avatar Dec 12 '22 06:12 max-arnold

Это частично поддерживается. Можно настроить драйвер так, чтобы в 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. Вероятно это стоило бы поменять.

Valeria1235 avatar Mar 24 '23 15:03 Valeria1235

Поскольку все примеры кода используют 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)
            )
        )

max-arnold avatar Apr 09 '23 08:04 max-arnold