Flask-SQLAlchemy 单表,多表查询结果集转json,Flask开发接口必备!

一、对于单表查询

首先有一个User模型

class User(db.Model):
    __tablename__ = 'user'
    uid = Column(Integer, primary_key=True)
    username = Column(String(15), nullable=False, unique=True)
    password_hash = Column(String(300), nullable=False)

查询User表所有内容

users = db.session.query(User).all()
print(users)

 将查询的结果打印出来

 显然list里面包含着两个User类对象,现在我们把这个对象转化成python字典就可以了,转化的代码如下

 

def class_to_dict(obj):
    
    is_list = obj.__class__ == [].__class__
    is_set = obj.__class__ == set().__class__
    if is_list or is_set:
        obj_arr = []
        for o in obj:
            dict = {}
            a = o.__dict__
            if "_sa_instance_state" in a:
                del a['_sa_instance_state']
            dict.update(a)
            obj_arr.append(dict)
        return obj_arr
    else:
        dict = {}
        a = obj.__dict__
        if "_sa_instance_state" in a:
            del a['_sa_instance_state']
        dict.update(a)
        return dict

使用它:

users = db.session.query(User).all()
    print(class_to_dict(users))

 得到结果为:

[{
	'username': 'admin',
	'password_hash': 'pbkdf2:sha256:50000$am6yZ6m9$ac369f910409f8b4663ba16f3b827bc67984c1f015bb08e3b018022c1543f196',
	'uid': 9,
}, {
	'username': 'test',
	'password_hash': 'pbkdf2:sha256:50000$NB1oPRRj$2d5353c9d9d727099fbd615c614da5e218e2946ef95019336729b1bd6e0cf527',
	'uid': 10,
}]

然后利用jsonify函数把这个结果转成json,retrun给前台就行了

二、多表查询

刚才已经建立了一个User表,现在再建立一个评论表Comment

class Comment(db.Model):
    __tablename__ = 'comment'

    cid = Column(Integer, primary_key=True)
    content = Column(String(1000), nullable=False)
    create_time = Column(String(30), nullable=False)
    user = relationship('User', primaryjoin='Comment.user_id == User.uid', backref='comments')

 现在联接查询

user_c = db.session.query(User,Comment).join(Comment).all()

#调用函数toJsonList

print(toJsonList(user_c))


#函数toJsonList,注意:toJsonList调用了class_to_dict函数,就是上面单表查询列出来的转换函数

def toJsonList(res):
    count = 0
    jsonList = []
    dict = {}
    for u in res:
        for c in u:
            count += 1
            if (count <= len(u)):
                dict.update(class_to_dict(c))  #函数classclass_to_dict
                if count == len(u):
                    jsonList.append(dict)
            else:
                count = 1
                dict = {}
                dict.update(class_to_dict(c))  #函数classclass_to_dict
    return jsonList;

得到结果

[
  {
    "content": "沙发", 
    "create_time": "2018-12-21 18:37", 
    "cid": 1, 
    "password_hash": "pbkdf2:sha256:50000$NB1oPRRj$2d5353c9d9d727099fbd615c614da5e218e2946ef95019336729b1bd6e0cf527", 
    "user_id": 10, 
	"uid": 10, 
    "username": "test"
  }, 
  {
	"content": "来晚了", 
    "create_time": "2018-12-21 18:38", 
    "id": 2,    
    "password_hash": "pbkdf2:sha256:50000$NB1oPRRj$2d5353c9d9d727099fbd615c614da5e218e2946ef95019336729b1bd6e0cf527", 
    "user_id": 10, 
	"uid": 10, 
    "username": "test"
  }
]

同样利用jsonify函数把这个结果转成json,retrun给前台就行了

多表查询转json需要注意的一点是

如果不同表里面有相同的字段名,转换出的结果会覆盖掉相同的字段名,导致查询结果缺失,建议建表时每张表字段名都不相同

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值