浅析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 mysqldb连接数据库
Mar 16 Python
理解Python中的With语句
Feb 02 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
Python从零开始创建区块链
Mar 06 Python
python用插值法绘制平滑曲线
Feb 19 Python
Python实现带下标索引的遍历操作示例
May 30 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
Python数学形态学实例分析
Sep 06 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
Keras之自定义损失(loss)函数用法说明
Jun 10 Python
Python开发入门——迭代的基本使用
Sep 03 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
将数组写入txt文件 var_export
2009/04/21 PHP
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
php除数取整示例
2014/04/24 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
一段多浏览器的"复制到剪贴板"javascript代码
2007/03/27 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
2018/09/11 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
node使用request请求的方法
2019/12/20 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
python和pyqt实现360的CLable控件
2014/02/21 Python
python计算方程式根的方法
2015/05/07 Python
python生成密码字典的方法
2018/07/06 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
python 实现两个npy档案合并
2020/07/01 Python
酒店应聘自荐信
2013/11/09 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
安全教育实施方案
2014/03/02 职场文书
法语专业求职信
2014/07/20 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
陕西导游词
2015/02/04 职场文书
2015年公司工作总结
2015/04/25 职场文书
2015年教师节广播稿
2015/08/19 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
Python 数据可视化之Seaborn详解
2021/11/02 Python