浅析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 简易计算器程序,代码就几行
Aug 29 Python
python的常见命令注入威胁
Feb 18 Python
python算法表示概念扫盲教程
Apr 13 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
Python的numpy库下的几个小函数的用法(小结)
Jul 12 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
Python自动登录QQ的实现示例
Aug 28 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
Jan 10 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
单位速度在实战中的运用
2020/03/04 星际争霸
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
jQuery点击导航栏选中更换样式的实现代码
2017/01/23 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
JS解析url查询参数的简单代码
2017/08/06 Javascript
js中的闭包学习心得
2018/02/06 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
python迭代器实例简析
2014/09/25 Python
使用Python抓取模板之家的CSS模板
2015/03/16 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
python中turtle库的简单使用教程
2020/11/11 Python
MoviePy常用剪辑类及Python视频剪辑自动化
2020/12/18 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
员工培训邀请函
2014/01/11 职场文书
个人实习生的自我评价
2014/02/16 职场文书
大学军训感言800字
2014/02/27 职场文书
罚款通知怎么写
2015/04/22 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
python的html标准库
2022/04/29 Python