侧边栏壁纸
博主头像
iColak's Blog

人生来来往往,来日并不方长

  • 累计撰写 106 篇文章
  • 累计创建 31 个标签
  • 累计收到 381 条评论

目 录CONTENT

文章目录

在sqlalchemy中使用JSON类型

苏维歌
2022-06-06 / 0 评论 / 0 点赞 / 40 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-07-05,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

需求:
项目中的字段无法确定,动态变化时使用。
也可以使用text、varchar来代替,但是text、varchar是不支持搜索的,并且不支持局部更新,只能更改全部字段,增加了i/o操作,不利于性能。

class User(db.Model):
    name= db.Column(db.String(32), comment='姓名')
    extra = db.Column(db.JSON, comment='扩展字段')

1、增加数据

User(name = '张三', extra = dict(age=18, gender = 1, weght = 70kg))) 
user = User.query.filter(User.name == '张三').first()

2、更新数据

from sqlalchemy.orm.attributes import flag_modified 
user.extra.update(dict(birthday=1998-12-12))) 
flag_modified(user, 'extra') 
db.session.add(user) 
db.session.commit()

3、删除

user.extra.pop('birthday') 
flag_modified(user, 'extra') 
db.session.add(user) 
db.session.commit()

4、查询

from sqlalchemy import cast, type_coerce
from sqlalchemy import String, JSON
import json
# 首先是针对单一数字、字符串时
User.query.filter(User.extra['age'] == 18, User.extra['weght'] == '70kg').first()
# 另一种特殊情况时,查询条件是一个对象时: 
# 先增加一组数据: 
user.extra.update(dict(info=dict(address='北京市'))) 
flag_modified(user, 'extra') 
db.session.commit() 
# 查询整个info时: 
User.query.filter(cast(User.extra['info'], String) == json.dumps({'address':'北京市'})).first() 
# or
User.query.filter(cast(User.extra['info'], String) == type_coerce({"address": "北京市"}, JSON)).first()
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
  3. QQ打赏

    qrcode qq

评论区