在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读写Excel文件的实例
Nov 01 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
深入浅出分析Python装饰器用法
Jul 28 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
python实现淘宝购物系统
Oct 25 Python
Python中低维数组填充高维数组的实现
Dec 02 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
基于python实现复制文件并重命名
Sep 16 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
一个取得文件扩展名的函数
2006/10/09 PHP
PHP 远程关机实现代码
2009/11/10 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
Javascript中产生固定结果的函数优化技巧
2013/01/16 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
2017/03/13 Javascript
详解Vue之计算属性
2020/06/20 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
python批量处理文件或文件夹
2020/07/28 Python
python 内置函数汇总详解
2019/09/16 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
美国网上书店:Barnes & Noble
2018/08/15 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
受欢迎的大学生自我评价
2013/12/05 职场文书
《赶海》教学反思
2014/04/20 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
护士求职自荐信范文
2015/03/04 职场文书
公积金贷款承诺书
2015/04/30 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js