80 lines
2.0 KiB
Python
80 lines
2.0 KiB
Python
|
# mysql/json.py
|
||
|
# Copyright (C) 2005-2018 the SQLAlchemy authors and contributors
|
||
|
# <see AUTHORS file>
|
||
|
#
|
||
|
# This module is part of SQLAlchemy and is released under
|
||
|
# the MIT License: http://www.opensource.org/licenses/mit-license.php
|
||
|
|
||
|
from __future__ import absolute_import
|
||
|
|
||
|
import json
|
||
|
|
||
|
from ...sql import elements
|
||
|
from ... import types as sqltypes
|
||
|
from ... import util
|
||
|
|
||
|
|
||
|
class JSON(sqltypes.JSON):
|
||
|
"""MySQL JSON type.
|
||
|
|
||
|
MySQL supports JSON as of version 5.7. Note that MariaDB does **not**
|
||
|
support JSON at the time of this writing.
|
||
|
|
||
|
The :class:`.mysql.JSON` type supports persistence of JSON values
|
||
|
as well as the core index operations provided by :class:`.types.JSON`
|
||
|
datatype, by adapting the operations to render the ``JSON_EXTRACT``
|
||
|
function at the database level.
|
||
|
|
||
|
.. versionadded:: 1.1
|
||
|
|
||
|
"""
|
||
|
|
||
|
pass
|
||
|
|
||
|
|
||
|
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):
|
||
|
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)
|
||
|
|
||
|
def process(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
|
||
|
])
|
||
|
)
|