前言

相比于 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. 09-看图理解数据结构与算法系列(B树)

    B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...

  2. Spring核心技术(七)——Spring容器的扩展

    本文将讨论如何关于在Spring生命周期中扩展Spring中的Bean功能. 容器的扩展 通常来说,开发者不需要通过继承ApplicationContext来实现自己的子类扩展功能.但是Spring ...

  3. Python实现图片切割

    import os from PIL import Image def splitimage(src, rownum, colnum, dstpath): img = Image.open(src) ...

  4. Light oj-1004 - Monkey Banana Problem,数字三角形的变形版~

                                                                                                     100 ...

  5. hdu 4788

    #include<stdio.h> #include<math.h> int main() { int a; double d; char s],ch; for;i++) d; ...

  6. CentOS7下安装单机版RabbitMQ及权限赋予

    RabbitMQ官网rpm软件包地址:https://www.rabbitmq.com/releases/ 一.安装环境: CentOS7.erlang-19.0.4-1.el7.centos.x86 ...

  7. 选择器的使用(root选择器)

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  8. Linux系统备份还原工具4(rsync/远程数据同步工具)

    rsync即是能备份系统也是数据同步的工具. 在Jenkins上可以使用rsync结合SSH的免密登录做数据同步和分发.这样一来可以达到部署全命令化,不需要依赖任何插件去实现. 命令参考:http:/ ...

  9. MongoDB小结21 - find【游标】

    数据库使用游标来控制find的执行结果. 客户端对游标的实现通常能够对最终结果进行有效控制. 可以限制结果的数量,略过部分结果,对任意方向任意键的组合对结果进行排序,或者去执行一些功能强大的操作. 我 ...

  10. json序列化后的是字符串,不是二进制。是字符串!!!确定不是二进制!!!

    1.现有一个自定义对象需要储存到sql数据库中去.这个对象里面属性很多,甚至包含一些元素量打到几十万的List集合属性.本人试着使用JSON序列化这个对象,储存到数据库,报maxjsonlength超 ...