在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