浅析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 相关文章推荐
浅谈function(函数)中的动态参数
Apr 30 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
利用 python 对目录下的文件进行过滤删除
Dec 27 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
python for循环remove同一个list过程解析
Aug 14 Python
Python 共享变量加锁、释放详解
Aug 28 Python
解决django model修改添加字段报错的问题
Nov 18 Python
Python数组拼接np.concatenate实现过程
Apr 18 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
pandas中DataFrame检测重复值的实现
May 26 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生成扇形比例图实例
2013/11/06 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
关于js注册事件的常用方法
2013/04/03 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
python简单操作excle的方法
2018/09/12 Python
python读写csv文件的方法
2019/08/13 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
Python matplotlib模块及柱状图用法解析
2020/08/10 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
详解HTML5中的Communication API基本使用方法
2016/01/29 HTML / CSS
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
自我鉴定书范文
2013/10/02 职场文书
大学生职业规划论文
2014/01/11 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
长征观后感
2015/06/09 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书