在Django的模型中执行原始SQL查询的方法

作者:goldensun 时间:2022-12-21 17:24:40 

有时候你会发现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']

标签:Django,模型,SQL
0
投稿

猜你喜欢

  • python三引号输出方法

    2023-05-28 13:00:27
  • 基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)

    2022-12-20 08:44:05
  • Go语言实现彩色输出示例详解

    2023-09-14 01:19:45
  • Python基于pyecharts实现关联图绘制

    2021-04-08 12:05:45
  • 深入了解和应用Python 装饰器 @decorator

    2024-01-02 09:20:05
  • TypeScript新语法之infer extends示例详解

    2024-03-13 20:42:27
  • python密码学Vignere密码教程

    2022-12-06 10:21:22
  • pycharm中选中一个单词替换所有重复单词的实现方法

    2022-11-07 02:51:16
  • Pycharm 2020最新永久激活码(附最新激活码和插件)

    2023-06-14 14:21:21
  • pycharm解决关闭flask后依旧可以访问服务的问题

    2023-12-27 06:39:27
  • 微信小程序module.exports模块化操作实例浅析

    2023-07-02 05:30:27
  • Html的几个小技巧

    2011-04-29 14:02:00
  • flask结合jinja2使用详解

    2022-07-22 12:18:57
  • 2009年五一劳动节logo欣赏

    2009-05-02 18:26:00
  • JS前端组件设计以业务为导向实践思考

    2024-06-21 04:13:33
  • 在前女友婚礼上用python把婚礼现场的WIFI名称改成了

    2023-05-26 15:15:49
  • Python最大连续区间和动态规划

    2023-02-13 09:40:32
  • div+css实现圆角边框

    2007-10-21 08:55:00
  • Python中数字(Number)数据类型常用操作

    2022-06-01 20:58:47
  • Zabbix实现微信报警功能

    2021-10-17 04:40:05
  • asp之家 网络编程 m.aspxhome.com