У меня есть устаревшая кодовая база Python 3 с использованием SQLAlchemy 1.1, которая по «причинам» имеет класс:
class jsonbool(str):
def __bool__(self):
return True if self == 'true' else False
Этот класс используется в выражении фильтра SQLAlchemy, например, query.filter(SomeTable.ABooleanColumn == anInstanceOfjsonbool).all()
. Это прекрасно работало в 1.1, так как использовалось строковое представление типа jsonbool
(например, true
или false
).
В SQLAlchemy 1.2 была добавлена дополнительная проверка, чтобы предотвратить приведение некоторых типов к логическим значениям. То, что сработало выше, теперь не работает с sqlalchemy.exc.StatementError: (builtins.TypeError) Not a boolean value: 'false'
(у false
фактически есть экземпляр jsonbool
).
Я подумал исправить это с помощью SQLAlchemy TypeDecorator, который позволил бы мне преобразовать параметр в логическое значение при связывании в выражении. Мой прототип был только для того, чтобы заставить работать нестандартное оформление шрифтов:
import sqlalchemy.types as types
class jsonbool(str, types.TypeDecorator):
impl = types.Boolean
def __bool__(self):
return True if self == 'true' else False
Увы, это и все аналогичное, что я пытаюсь получить, приводит к AttributeError: 'Boolean' object has no attribute 'self_group'
(где s/Boolean/WhateverImplIPick
) при попытке выполнить запрос. Я также пытался использовать UserDefinedType
с тем же результатом.
Как изменить поведение типа jsonbool
, когда я использую его как часть выражения SQLAlchemy?