浅析python中SQLAlchemy排序的一个坑


Posted in Python onFebruary 24, 2017

前言

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。最近在使用SQLAlchemy排序遇到了一个坑,所以想着总结下来,分享给更多的朋友,下面来一起看看吧。

坑的代码

query = db_session.query(UserVideo.vid,
         UserVideo.uid,
         UserVideo.v_width,
         UserVideo.v_height,
         UserVideo.create_time,
         UserVideo.cover,
         UserVideo.source_url,
         UserVideo.v_type,
         UserVideo.category,
         User.username,
         User.sex,
         UserExtraInfo.avatar,
         UserExtraInfo.watermark)
  query = query.filter(UserVideo.status == 1,
        User.uid == UserVideo.uid,
        UserExtraInfo.uid == UserVideo.uid) 
  query = query.filter(UserVideo.status == 1)
  query = query.order_by(-UserVideo.vid)
  query = query.limit(20).all()

不坑的代码

query = db_session.query(UserVideo.vid,
         UserVideo.uid,
         UserVideo.v_width,
         UserVideo.v_height,
         UserVideo.create_time,
         UserVideo.cover,
         UserVideo.source_url,
         UserVideo.v_type,
         UserVideo.category,
         User.username,
         User.sex,
         UserExtraInfo.avatar,
         UserExtraInfo.watermark)
  query = query.filter(UserVideo.status == 1,
        User.uid == UserVideo.uid,
        UserExtraInfo.uid == UserVideo.uid) # .order_by(UserVideo.vid.desc()).limit(20).all()
  query = query.filter(UserVideo.status == 1)
  query = query.order_by(UserVideo.vid.desc())
  query = query.limit(20).all()

对,你没看错,就是那个横杠,拉慢速度。改成 desc() 函数速度能提高10倍

下面附上一个 sqlalchemy 高性能随机取出若干条数据

query = db_session.query(UserVideo.vid,
          UserVideo.uid,
          UserVideo.v_width,
          UserVideo.v_height,
          UserVideo.create_time,
          UserVideo.cover,
          UserVideo.source_url,
          UserVideo.v_type,
          UserVideo.category,
          User.username,
          User.sex,
          UserExtraInfo.avatar,
          UserExtraInfo.watermark)
   query = query.filter(UserVideo.status == 1, User.uid == UserVideo.uid, UserExtraInfo.uid == UserVideo.uid)
rvid = db_session.query(func.round(random.random() * func.max(UserVideo.vid)).label('rvid')).subquery()
query = query.filter(UserVideo.category == category)
query_tail = query
query_tail = query_tail.join(rvid, UserVideo.vid > rvid.c.rvid).limit(20).all()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python判断端口是否打开的实现代码
Feb 10 Python
wxPython之解决闪烁的问题
Jan 15 Python
python 读取视频,处理后,实时计算帧数fps的方法
Jul 10 Python
解读python如何实现决策树算法
Oct 11 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
Python玩转加密的技巧【推荐】
May 13 Python
python networkx 根据图的权重画图实现
Jul 10 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
Python的缺点和劣势分析
Nov 19 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
如何解决安装python3.6.1失败
Jul 01 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
python函数的5种参数详解
Feb 24 #Python
Python实现读取文件最后n行的方法
Feb 23 #Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 #Python
Python命令启动Web服务器实例详解
Feb 23 #Python
Python 基础教程之包和类的用法
Feb 23 #Python
python安装oracle扩展及数据库连接方法
Feb 21 #Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 #Python
You might like
php时间戳转换的示例
2014/03/31 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
2015/12/25 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
2017/01/10 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
zbar解码二维码和条形码示例
2014/02/07 Python
Python2.x与Python3.x的区别
2016/01/14 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
python去除字符串中的换行符
2017/10/11 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
Jupyter加载文件的实现方法
2020/04/14 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
浅析python 字典嵌套
2020/09/29 Python
什么是Remote Module
2016/06/10 面试题
建筑专业自荐信
2013/10/18 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
工作表现自我评价
2014/02/08 职场文书
党小组评议意见
2015/06/02 职场文书
区域销售大会开幕词
2016/03/04 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
图文详解nginx日志切割的实现
2022/01/18 Servers