Skip to content

TypeDecorator.process_bind_param only possible return value is Optional[str], but this doesn't work for binary types #214

Open
@synic

Description

@synic

Probably doing something wrong here, but I can't figure out how to make this work:

class EncryptedType(TypeDecorator):
    impl = LargeBinary

    def __init__(self, engine: EncryptionEngine, **kwargs: Any) -> None:
        super().__init__(**kwargs)
        self.engine = engine

    def process_bind_param(self, value: Optional[str], dialect: Dialect) -> Optional[str]:
        if value is None:
            return None
        return self.engine.encrypt(value).decode()  # convert to string, but I'd rather not

    def process_result_value(self, value: Optional[bytes], dialect: Dialect) -> Optional[str]:
        if value is None:
            return None
        return self.engine.decrypt(value)

Trying to insert data into a column results in an error like this:

StatementError: (builtins.TypeError) memoryview: a bytes-like object is required, not 'str'

Simply returning self.engine.encrypt(value) without the .decode() to convert to a string works, but then mypy complains that Return type "Optional[bytes]" of "process_bind_param" incompatible with return type "Optional[str]" in supertype "TypeDecorator"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions