在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实现封装得到virustotal扫描结果
Oct 05 Python
Python base64编码解码实例
Jun 21 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 Python
对Python中内置异常层次结构详解
Oct 18 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
python实现静态web服务器
Sep 03 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
Python classmethod装饰器原理及用法解析
Oct 17 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
PHP编写简单的App接口
2016/08/28 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
JavaScript中的null和undefined解析
2012/04/14 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python实现快速计算词频功能示例
2018/06/25 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
函授自我鉴定
2013/11/06 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
农村党员对照检查材料
2014/09/24 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
品质保证书格式
2015/02/28 职场文书
化工生产实习心得体会
2016/01/22 职场文书
自考生自我评价
2019/06/21 职场文书