在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 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
用Python实现换行符转换的脚本的教程
Apr 16 Python
儿童学习python的一些小技巧
May 27 Python
python 列表降维的实例讲解
Jun 28 Python
python实现傅里叶级数展开的实现
Jul 21 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
理想高通滤波实现Python opencv示例
Jan 30 Python
什么是python的列表推导式
May 26 Python
python如何删除文件、目录
Jun 23 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
Python竟然能剪辑视频
May 25 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
PHP连接SQLServer2005 的问题解决方法
2010/07/19 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
python多线程抓取天涯帖子内容示例
2014/04/03 Python
python清除字符串里非字母字符的方法
2015/07/02 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
使用K.function()调试keras操作
2020/06/17 Python
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
物流仓管员岗位职责
2013/12/04 职场文书
将相和教学反思
2014/02/04 职场文书
社会实践活动总结报告
2014/04/29 职场文书
二手房购房协议书范本
2014/10/05 职场文书
村级干部党员公开承诺事项
2015/05/04 职场文书
Pandas数据类型之category的用法
2021/06/28 Python