mysql在5.7中增加了对json类型的支持,可以看作是mysql对mongodb的一种屈服,以空间,时间,计算成本实现功能性。
近期开发表单组件相关功能,mongo最适合用来处理这些数据,可考虑到老数据兼容问题,涉及到工作量,最终选择了mysql的json类型来完成此功能,也是本人第一次使用mysql的json类型。下面谈一下使用感受及遇到的问题。
以python为例
1.数据创建
创建数据时跟其他类型相同,插入json类型即可,可以是json数组,也可以是对象。
2.查询数据
数据查询是选择json类型的主要原因之一,储存在mysql中的json类型,可以直接当成对象查询,适用于对象本身的属性及方法,当然,这是牺牲空间时间换来的,初用此类型便沉迷其中,因为非常好用,但这里还是不建议大量使用,毕竟不如nosql来的好用。
3.修改数据
在修改数据时,遇到了问题,原本把json类型按照其他类型一样直接修改,但是并没有生效,折腾一番才知道需要用到flag_modified
def flag_modified(instance, key):
"""Mark an attribute on an instance as 'modified'.
This sets the 'modified' flag on the instance and
establishes an unconditional change event for the given attribute.
The attribute must have a value present, else an
:class:`.InvalidRequestError` is raised.
To mark an object "dirty" without referring to any specific attribute
so that it is considered within a flush, use the
:func:`.attributes.flag_dirty` call.
.. seealso::
:func:`.attributes.flag_dirty`
"""
state, dict_ = instance_state(instance), instance_dict(instance)
impl = state.manager[key].impl
impl.dispatch.modified(state, impl._modified_token)
state._modified_event(dict_, impl, NO_VALUE, is_userland=True)
具体用法如下:
当json内储存的类型为字典字符串时,添加数据用到字典的update方法
def update(self, value, index=0):
self.apply_form.update(value)
flag_modified(self, 'apply_form')
db.session.add(self)
其他操作,数组的添加删除,都只需用对应方法即可,这基本上也是使用mysql储存json类型唯一一个需要注意的地方。