在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处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
python把1变成01的步骤总结
Feb 27 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
Python实现加密接口测试方法步骤详解
Jun 05 Python
Pycharm github配置实现过程图解
Oct 13 Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
Django扫码抽奖平台的配置过程详解
Jan 14 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开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
PHP生成短网址方法汇总
2016/07/12 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Python是怎样处理json模块的
2020/07/16 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
C/C++程序员常见面试题一
2012/12/08 面试题
自荐书4要点
2014/01/25 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
自强之星事迹材料
2014/05/12 职场文书
论群众路线学习笔记
2014/11/06 职场文书
结婚老公保证书
2015/02/26 职场文书
小学主题班会教案
2015/08/17 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server