Запись объекта pydantic в столбец sqlalchemy jsonPython

Программы на Python
Ответить
Anonymous
 Запись объекта pydantic в столбец sqlalchemy json

Сообщение Anonymous »

Я ищу способ сохранить объект pydantic в столбце sqlalchemy json. Мои попытки до сих пор сбиваются из-за поля datetime в объекте pydantic. Мне кажется, что я упускаю что-то очевидное.
Моей первой попыткой была просто сериализовать результат .dict(). Но это не преобразует объекты datetime в строки, поэтому сериализатор падает. Если я конвертирую с помощью .json, результатом будет строка, а в базе данных будет храниться строка в формате JSON, а не словарь.
import sqlalchemy.orm
from pydantic import BaseModel
from datetime import datetime

mapper_registry = sqlalchemy.orm.registry()
Base = mapper_registry.generate_base()

class _PydanticType(sqlalchemy.types.TypeDecorator):
impl = sqlalchemy.types.JSON

def __init__(self, pydantic_type):
super().__init__()
self._pydantic_type = pydantic_type

def process_bind_param(self, value, dialect):
return value.dict() if value else None

def process_result_value(self, value, dialect):
return self._pydantic_type.parse_obj(value) if value else None

class Test(BaseModel):
timestamp: datetime

class Foo(Base):
__tablename__ = 'foo'
x = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
y = sqlalchemy.Column(_PydanticType(Test))

engine = sqlalchemy.create_engine('sqlite:///x.db', echo=True)
mapper_registry.metadata.create_all(bind=engine)
session = sqlalchemy.orm.sessionmaker(bind=engine)()
session.add(Foo(x=1, y=Test(timestamp=datetime.now())))
session.commit()

sqlalchemy.exc.StatementError: (builtins.TypeError) Object of type datetime is not JSON serializable


Подробнее здесь: https://stackoverflow.com/questions/668 ... son-column
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»