diff options
Diffstat (limited to 'lib/sqlalchemy/dialects/mysql/json.py')
-rw-r--r-- | lib/sqlalchemy/dialects/mysql/json.py | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/lib/sqlalchemy/dialects/mysql/json.py b/lib/sqlalchemy/dialects/mysql/json.py index 3840a7cd6..8dd99bd45 100644 --- a/lib/sqlalchemy/dialects/mysql/json.py +++ b/lib/sqlalchemy/dialects/mysql/json.py @@ -31,25 +31,49 @@ class JSON(sqltypes.JSON): pass -class JSONIndexType(sqltypes.JSON.JSONIndexType): + +class _FormatTypeMixin(object): + def _format_value(self, value): + raise NotImplementedError() + def bind_processor(self, dialect): + super_proc = self.string_bind_processor(dialect) + def process(value): - if isinstance(value, int): - return "$[%s]" % value - else: - return '$."%s"' % value + value = self._format_value(value) + if super_proc: + value = super_proc(value) + return value return process + def literal_processor(self, dialect): + super_proc = self.string_literal_processor(dialect) -class JSONPathType(sqltypes.JSON.JSONPathType): - def bind_processor(self, dialect): def process(value): - return "$%s" % ( - "".join([ - "[%s]" % elem if isinstance(elem, int) - else '."%s"' % elem for elem in value - ]) - ) + value = self._format_value(value) + if super_proc: + value = super_proc(value) + return value return process + + +class JSONIndexType(_FormatTypeMixin, sqltypes.JSON.JSONIndexType): + + def _format_value(self, value): + if isinstance(value, int): + value = "$[%s]" % value + else: + value = '$."%s"' % value + return value + + +class JSONPathType(_FormatTypeMixin, sqltypes.JSON.JSONPathType): + def _format_value(self, value): + return "$%s" % ( + "".join([ + "[%s]" % elem if isinstance(elem, int) + else '."%s"' % elem for elem in value + ]) + ) |