在sqlalchemy中使用JSON类型

45次阅读
没有评论

共计 1064 个字符,预计需要花费 3 分钟才能阅读完成。

需求:
项目中的字段无法确定,动态变化时使用。
也可以使用 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()
正文完
觉得有用?欢迎赞赏,感谢!
post-qrcode
 0
苏维歌
版权声明:本站原创文章,由 苏维歌 于2022-06-06发表,共计1064字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码