在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实现端口复用实例代码
Jul 03 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
Python下载指定页面上图片的方法
May 12 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
python3.x上post发送json数据
Mar 04 Python
Django添加sitemap的方法示例
Aug 06 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
Django实现单用户登录的方法示例
Mar 28 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
Python中Unittest框架的具体使用
Aug 27 Python
基于python图像处理API的使用示例
Apr 03 Python
Python 匹配文本并在其上一行追加文本
May 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
How do I change MySQL timezone?
2008/03/26 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
运算符&amp;&amp;的三个不同层次
2013/04/07 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
python求素数示例分享
2014/02/16 Python
Python 登录网站详解及实例
2017/04/11 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
Django 解决由save方法引发的错误
2020/05/21 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
实习生自荐信范文分享
2013/11/27 职场文书
酒店中秋节活动方案
2014/01/31 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
《老山界》教学反思
2014/04/08 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
工程质检员岗位职责
2015/04/08 职场文书
生产设备维护保养制度
2015/08/06 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
MySQL学习之基础命令实操总结
2022/03/19 MySQL
vue递归实现树形组件
2022/07/15 Vue.js