Mysql从5.7版本后支持Json字段,本片文章记录Flask-Sqlalchemy如何对于Json字段进行增删改查操作
项目中的字段无法确定,动态变化时使用。
也可以使用text、varchar来代替,但是text、varchar是不支持搜索的,并且不支持局部更新,只能更改全部字段,增加了i/o操作,不利于性能。
定义一个User
类
1 | class User(db.Model): |
2 | name= db.Column(db.String(32), comment='姓名') |
3 | extra = db.Column(db.JSON, comment='扩展字段') |
0x01 添加数据
1 | user = User(name = '张三', extra = dict(age=18, gender = 1, weght = 70kg))) |
2 | db.session.add(user) |
3 | db.session.commit() |
0x02 更新Json数据
1 | from sqlalchemy.orm.attributes import flag_modified |
2 | user.extra.update(dict(birthday=1998-12-12))) |
3 | flag_modified(user, 'extra') |
4 | db.session.add(user) |
5 | db.session.commit() |
0x03 删除Json字段
1 | user.extra.pop('birthday') |
2 | flag_modified(user, 'extra') |
3 | db.session.add(user) |
4 | db.session.commit() |
0x04 查询Json字段
1 | from sqlalchemy import cast, type_coerce |
2 | from sqlalchemy import String, JSON |
3 | import json |
4 | # 首先是针对单一数字、字符串时 |
5 | User.query.filter(User.extra['age'] == 18, User.extra['weght'] == '70kg').first() |
6 | # 另一种特殊情况时,查询条件是一个对象时: |
7 | # 先增加一组数据: |
8 | user.extra.update(dict(info=dict(address='北京市'))) |
9 | flag_modified(user, 'extra') |
10 | db.session.commit() |
11 | # 查询整个info时: |
12 | User.query.filter(cast(User.extra['info'], String) == json.dumps({'address':'北京市'})).first() |
13 | # or |
14 | User.query.filter(cast(User.extra['info'], String) == type_coerce({"address": "北京市"}, JSON)).first() |