在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中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
Python批量查询域名是否被注册过
Jun 21 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
numpy.random模块用法总结
May 27 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
python识别图像并提取文字的实现方法
Jun 28 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
python中sort和sorted排序的实例方法
Aug 26 Python
Python爬取某平台短视频的方法
Feb 08 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
Cpy和Python的效率对比
2015/03/20 Python
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
荷兰家电销售网站:Welhof
2020/12/08 全球购物
打架检讨书100字
2014/01/19 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
行政处罚告知书
2015/07/01 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
Python3接口性能测试实例代码
2021/06/20 Python