在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 的内置字符串方法小结
Mar 15 Python
python算法表示概念扫盲教程
Apr 13 Python
wxPython之解决闪烁的问题
Jan 15 Python
python多线程并发实例及其优化
Jun 27 Python
Python文本处理简单易懂方法解析
Dec 19 Python
python实现门限回归方式
Feb 29 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Python如何对XML 解析
Jun 28 Python
基于python实现MQTT发布订阅过程原理解析
Jul 27 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
python 密码学示例——凯撒密码的实现
Sep 21 Python
python openCV自制绘画板
Oct 27 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 禁止页面缓存输出
2009/01/07 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
mongodb和php的用法详解
2019/03/25 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript编程起步(第四课)
2007/01/10 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
python分析网页上所有超链接的方法
2015/05/08 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python线性方程组求解运算示例
2018/01/17 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
学python需要去培训机构吗
2020/07/01 Python
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
民事诉讼代理委托书
2014/10/08 职场文书
2014年商场工作总结
2014/11/22 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
2019通用版劳动合同范本!
2019/07/11 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
使用pytorch实现线性回归
2021/04/11 Python