• Flask-SQLAlchemy


    前言

            相比于 Django 的 ORM ,SQLAlchemy "不依靠外键进行跨表联查" 的解决方案就比较多。

            没啥好说的,只能怪自己学艺不精..  _(:з」∠)_ 

    解决办法

    query = database.session().query(models.A, models.B)
    query = query.join(models.B, models.B.UUID == models.A.UUID).filter(models.a.UUID == '2018061520180621').filter(models.b.xx= 'haha')
    # 第二个filter可以继续过滤、join 或者删掉..
    data = query.all() >>> print ( type(data) ) <class 'sqlalchemy.util._collections.result'> # 然而: # 列表中的项并不是标准的 Python tuple,<class 'sqlalchemy.util._collections.result'>,它是一个 AbstractKeyedTuple 对象,拥有一个 keys() 方法, # 这样可以很容易将其转换成 dict : list = [dict(zip(result.keys(), result)) for result in data] print(jsonify(list))

    # 还可以在 filter 得到结果后继续加 join 进行多表联查

     按用户名摸糊查询

    trans_details.query.join( models.B, models.A.user_id==models.B.id ).filter(Users.username.like('%xx%')) 
    #select xxx from trans_details inner join trans_details on users.id=trans_details.user_id where users.username like '%xx%'

    左外联接(left join),没有内容显示为null

    trans_details.query.outerjoin(User).filter(Users.username.like('%xx%'))
    #select xxx from trans_details left outer join trans_details on users.id=trans_details.user_id where users.username like '%xx%'

    神秘代码

    from flask import jsonify
    
    -- article_view.py
    @api.route('/get')
    def get_article():
        dic = {"data": []}
        # 单表查询
        # data = db.session.query(models.TbArticle).all()
        # data = db.session.query(models.TbArticle, models.TbArticleContent)
        # data.join(models.TbArticle, models.TbArticle.uuid == models.TbArticleContent.uuid)
    
        # 另一种诡异的写法,没试过
        # results = (
        #     db.session.query(
        #         Topic.content.label('topic_content'), Reply.content.label('reply_content')
        #         )
        #     ).select_from(Topic, Reply).filter(Topic.id == Reply.topic_id).paginate(page, per_page)
    
        # 上文的写法
        query = db.session().query(models.TbArticle, models.TbArticleContent)
        query = query.join(
    
            # 取出所有
            models.TbArticleContent, models.TbArticleContent.uuid == models.TbArticle.uuid)
    
            # 过滤出 TbArticle.uuid : [tuple]
            # .filter(models.TbArticle.uuid == '0553857835404640804')
    
            # 自定义显示字段:[]
            # .with_entities(
            #     models.TbArticle.uuid, models.TbArticle.title, models.TbArticleContent.content
            # )
    
        data = query.all()
    
        data_list 数据结构:[{"TbArticle": <TbArticle 2312>, "TbArticleContent": <TbArticleContent 0553857835404640804>},{}]
        data_list = [dict(zip(result.keys(), result)) for result in data]
    
        dic["data"].extend(data_list)
        print(data_list)
    
        # 取出字典中的对象:
        # for i in data_list:
        #     print(i["TbArticle"].create_time)
        #     print(i["TbArticleContent"].Content)
    
        # for obj in data:
        #     # dic["data"].append({"uuid": obj.uuid, "title": obj.title})
        #     print(type(obj))
        # return jsonify(dic)
    
        return jsonify("ok")
    
    查询出的结果/对象:
    # from sqlalchemy.util._collections import result
    View Code

    博客搬运地址

    1. Flask-SQLAlchemy 操作 - 连表查询 - 筛选字段
    2. flask sqlalchemy非外键连接两个表
    3. Python sqlalchemy 多表查询 没有外键
    4. sqlalchemy多表联合查询
    5. 在 Flask-SQLAlchemy 中联表查询 - (目测是真正的大佬)
  • 相关阅读:
    C语言基本快速入门教程
    几何深度学习前沿
    Anaconda 更改清华源
    大学安全教育-实验室安全测试题库
    《如何写好科研论文》(清华)慕课答案
    集群考试试卷
    集群考试相关
    Linux下tar压缩解压用法
    2020-安全微课(新生入学教育)答案
    函数用法和底层分析
  • 原文地址:https://www.cnblogs.com/clement-jiao/p/10010497.html
Copyright © 2020-2023  润新知