在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文件比较示例分享
Jan 10 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python 自动化表单提交实例代码
Jun 08 Python
Python简单实现控制电脑的方法
Jan 22 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
Python Web编程之WSGI协议简介
Jul 18 Python
Python 使用类写装饰器的小技巧
Sep 30 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
详解Python流程控制语句
Oct 28 Python
解决Pytorch半精度浮点型网络训练的问题
May 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编程中字符串处理的5个技巧小结
2007/11/13 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php过滤敏感词的示例
2014/03/31 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
[01:03:36]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第二场 1月26日
2021/03/11 DOTA
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
python实现的简单文本类游戏实例
2015/04/28 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
用Python实现数据的透视表的方法
2018/11/16 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
Pytorch 实现权重初始化
2019/12/31 Python
意大利团购网站:Groupon意大利
2016/10/11 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
工地门卫岗位职责
2013/12/30 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python