在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 相关文章推荐
Python的print用法示例
Feb 11 Python
用Python和MD5实现网站挂马检测程序
Mar 13 Python
Python文件和流(实例讲解)
Sep 12 Python
python matplotlib画图实例代码分享
Dec 27 Python
Python socket套接字实现C/S模式远程命令执行功能案例
Jul 06 Python
django 实现电子支付功能的示例代码
Jul 25 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Django框架模板用法详解
Jun 10 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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 extract 将数组拆分成多个变量的函数
2010/06/30 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
二级域名转向类
2006/11/09 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
python实现聊天小程序
2018/03/13 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python字典的遍历3种方法详解
2019/08/10 Python
详解python statistics模块及函数用法
2019/10/27 Python
python文件及目录操作代码汇总
2020/07/08 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
给排水工程师岗位职责
2013/11/21 职场文书
青年文明号复核材料
2014/02/11 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
微信搭讪开场白
2015/05/28 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
python基础入门之字典和集合
2021/06/13 Python
mysql的数据压缩性能对比详情
2021/11/07 MySQL