浅析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 def函数的定义、使用及参数传递实现代码
Aug 10 Python
浅析Python中将单词首字母大写的capitalize()方法
May 18 Python
Python3实现的字典遍历操作详解
Apr 18 Python
python矩阵/字典实现最短路径算法
Jan 17 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
python序列类型种类详解
Feb 26 Python
Django models文件模型变更错误解决
May 11 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
python 5个顶级异步框架推荐
Sep 09 Python
python 实现aes256加密
Nov 27 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函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
python函数装饰器用法实例详解
2015/06/04 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
python实现kMeans算法
2017/12/21 Python
详解python单元测试框架unittest
2018/07/02 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
python实现各种插值法(数值分析)
2019/07/30 Python
vue常用指令代码实例总结
2020/03/16 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
小班下学期评语
2014/05/04 职场文书
体育专业求职信
2014/07/16 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
舞出我人生观后感
2015/06/16 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
八年级英语教学反思
2016/02/15 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
vue+iview实现手机号分段输入框
2022/03/25 Vue.js