浅析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 相关文章推荐
把MySQL表结构映射为Python中的对象的教程
Apr 07 Python
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
python dict 相同key 合并value的实例
Jan 21 Python
python保存字典和读取字典的实例代码
Jul 07 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
Python安装whl文件过程图解
Feb 18 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
详解python polyscope库的安装和例程
Nov 13 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 Python
Pytorch实现WGAN用于动漫头像生成
Mar 04 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 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/12/12 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
PHP实现微信红包金额拆分试玩的算法示例
2018/04/07 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
2013/08/29 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
Angular路由简单学习
2016/12/26 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
Python中if __name__ == "__main__"详细解释
2014/10/21 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
俄罗斯有趣和原创礼物网上商店:MagicMag
2019/08/01 全球购物
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
股份合作协议书
2014/04/12 职场文书
服务承诺口号
2014/05/22 职场文书
离婚协议书格式
2014/11/21 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
2016年元旦致辞
2015/08/01 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang