前言

相比于 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 == '').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

博客搬运地址

  1. Flask-SQLAlchemy 操作 - 连表查询 - 筛选字段
  2. flask sqlalchemy非外键连接两个表
  3. Python sqlalchemy 多表查询 没有外键
  4. sqlalchemy多表联合查询
  5. 在 Flask-SQLAlchemy 中联表查询 - (目测是真正的大佬)

Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我的更多相关文章

  1. 【Hibernate】无外键多表查询

    无外键多表查询时编写hql,直接使用逗号分隔表,where作为联合查询条件进行查询.查询出来的结果可为两种,List<List<Object>>或者List<Map< ...

  2. 主外键多表查询demo

    https://www.cnblogs.com/DragonFire/p/6949767.html mySQL练习-主外键多表查询 MySQL练习-主外键多表查询 练习: 1.建立表关系: 请创建如下 ...

  3. mysql外键与表查询

    目录 自增特性 外键 外键关系 外键创建 外键的约束效果 级联更新级联删除 多对多关系 一对一关系 表查询关键字 select与from where筛选 group by分组 练习 关系练习 查询练习 ...

  4. MySQL练习-主外键多表查询

    练习: 1.建立表关系: 请创建如下表,并创建相关约束 USE db1; CREATE TABLE class( cid INT AUTO_INCREMENT PRIMARY KEY, caption ...

  5. sqlalchemy外键和relationship查询

    前面的文章中讲解了外键的基础知识和操作,上一篇文章讲解了sqlalchemy的基本操作.前面两篇文章都是作为铺垫,为下面的文章打好基础.记得初一时第一次期中考试时考的不好,老爸安慰我说:“学习是一个循 ...

  6. oracle查询某张表的外键,并用 truncate 命令有外键的表中的数据

    注:本文来源于<oracle查询某张表的外键(最终解决办法)> 一:几个查询表外键的脚本 select b.table_name, b.column_name from user_cons ...

  7. 删除带外键的表【foreign key constraint fails】报错

    title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibern ...

  8. MySQ-表关系-外键-修改表结构-复制表-03

    目录 前言 不合理的表结构(案例) 带来的问题 如何解决问题? 如何确定表关系? 表关系 一对多 多对多 一对一 应用场景 判断表关系最简单的语法 三种关系常见案例 如何建立表关系? 外键 forei ...

  9. SQL主外键和子查询

    主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...

随机推荐

  1. ASP.net在IE6下乱码问题

    今天处理程序的时候遇到一个坑爹的问题 该死的IE6传中文参数会出现 类似于◆的乱码 不过终于解决了  也许解决的方法有很多  和大家分享下我的解决方案 我用的javascript中 传的参数 < ...

  2. HDU 1525 Euclid Game

    题目大意: 给定2个数a , b,假定b>=a总是从b中取走一个a的整数倍,也就是让 b-k*a(k*a<=b) 每人执行一步这个操作,最后得到0的人胜利结束游戏 (0,a)是一个终止态P ...

  3. 乱记结论之OI常用四大数列

    一.斐波那契数列 $f(0)=1,f(1)=1,f(i)=f(i-1)+f(i-2) \ \ \ \ (i>=2)$ 经典的解释是兔子生小孩,第0年一对兔子,一对兔子需要一年长大,后面每年都生小 ...

  4. P1605 迷宫 洛谷

    https://www.luogu.org/problem/show?pid=1605 题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐 ...

  5. HDU——1285 确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  6. 所有的异常都要使用try catch 语句捕获?

    在开发应用程序过程中必须检测代码可能发生的错误并进行正确的处理,这个在理想的情况下,应用程序中的每行 代码都按照预想的执行,要用到的每种资源总是可以利用,但是在实际的开发过程中,写代码难免会出错,或是 ...

  7. TensorFlow-GPU环境配置之四——配置和编译TensorFlow

    首先,使用configure进行配置 配置完成后,使用bazel编译retrain命令,编译命令中加入--config=cuda即为启用GPU 编译进行中... 编译完成 编译完成后,调用retrai ...

  8. 手动安装Firefox Linux

    (2015-06-05 17:22:19)[编辑][删除] 转载▼ 标签: 股票 Firefox 下载文件以.tar和.bz2格式保存,必须从这些压缩包中提取文件.不想删除当前安装的 Firefox, ...

  9. USRP内部的寄存器

    usrp_regs.hpp #ifndef INCLUDED_USRP2_REGS_HPP #define INCLUDED_USRP2_REGS_HPP ////////////////////// ...

  10. Linux watchdog 6300esb

     基本原理: Linux 自带了一个 watchdog 的实现,用于监视系统的执行,包含一个内核 watchdog module 和一个用户空间的 watchdog 程序.内核 watchdog ...