在Django的模型中执行原始SQL查询的方法


Posted in Python onJuly 21, 2015

有时候你会发现Django数据库API带给你的也只有这么多,那你可以为你的数据库写一些自定义SQL查询。 你可以通过导入django.db.connection对像来轻松实现,它代表当前数据库连接。 要使用它,需要通过connection.cursor()得到一个游标对像。 然后,使用cursor.execute(sql, [params])来执行SQL语句,使用cursor.fetchone()或者cursor.fetchall()来返回记录集。 例如:

>>> from django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute("""
...  SELECT DISTINCT first_name
...  FROM people_person
...  WHERE last_name = %s""", ['Lennon'])
>>> row = cursor.fetchone()
>>> print row
['John']

connection和cursor几乎实现了标准Python DB-API,你可以访问` http://www.python.org/peps/pep-0249.html <http://www.python.org/peps/pep-0249.html>`__来获取更多信息。 如果你对Python DB-API不熟悉,请注意在cursor.execute() 的SQL语句中使用`` “%s”`` ,而不要在SQL内直接添加参数。 如果你使用这项技术,数据库基础库将会自动添加引号,同时在必要的情况下转意你的参数。

不要把你的视图代码和django.db.connection语句混杂在一起,把它们放在自定义模型或者自定义manager方法中是个不错的主意。 比如,上面的例子可以被整合成一个自定义manager方法,就像这样:

from django.db import connection, models

class PersonManager(models.Manager):
  def first_names(self, last_name):
    cursor = connection.cursor()
    cursor.execute("""
      SELECT DISTINCT first_name
      FROM people_person
      WHERE last_name = %s""", [last_name])
    return [row[0] for row in cursor.fetchone()]

class Person(models.Model):
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)
  objects = PersonManager()

然后这样使用:

>>> Person.objects.first_names('Lennon')
['John', 'Cynthia']
Python 相关文章推荐
tensorflow中next_batch的具体使用
Feb 02 Python
浅谈django rest jwt vue 跨域问题
Oct 26 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
python cv2截取不规则区域图片实例
Dec 21 Python
Python json模块与jsonpath模块区别详解
Mar 05 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
python 错误处理 assert详解
Apr 20 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
Apr 21 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
python分分钟绘制精美地图海报
Feb 15 Python
在Django的模型中添加自定义方法的示例
Jul 21 #Python
详解Python的Django框架中Manager方法的使用
Jul 21 #Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 #Python
通过数据库向Django模型添加字段的示例
Jul 21 #Python
Django的数据模型访问多对多键值的方法
Jul 21 #Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 #Python
编写自定义的Django模板加载器的简单示例
Jul 21 #Python
You might like
php读取文件内容的方法汇总
2015/01/24 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
php生成curl命令行的方法
2015/12/14 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
JS 判断代码全收集
2009/04/28 Javascript
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
在vue中使用公共过滤器filter的方法
2018/06/26 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
Python科学计算环境推荐——Anaconda
2014/06/30 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
简历中个人自我评价范文
2013/12/26 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
文化产业实施方案
2014/06/07 职场文书
公司董事任命书
2015/09/21 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript