在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实现矩阵乘法的方法
Jun 28 Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
Python实现树莓派WiFi断线自动重连的实例代码
Mar 16 Python
python删除字符串中指定字符的方法
Aug 13 Python
python实现自动解数独小程序
Jan 21 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
Python之pymysql的使用小结
Jul 01 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
Python调用C语言程序方法解析
Jul 07 Python
Python进程池与进程锁之语法学习
Apr 11 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
Prototype Function对象 学习
2009/07/12 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
javascript中关于执行环境的杂谈
2011/08/14 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
DNA基因检测和分析:23andMe
2019/05/01 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
毕业生就业推荐信范文
2013/12/01 职场文书
班主任工作经验材料
2014/02/02 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
python 爬取华为应用市场评论
2021/05/29 Python