通常情况下,Django的ORM都能满足需要,但也有极少情况下,需要原生sql才能有达到目的。如果对数据库没有足够的了解,在使用django时不建议再另写原生sql。下面是三种使用原生sql的三种方式,其实下面的查询使用ORM就能达到目的,使用原生sql只为演示用法(使用的django中的shell)
方式一:使用extra
In [6]: articles = models.Article.objects.filter(id__gt=2).extra(where=['read>10'])
In [7]: for article in articles:
...: print(article.id, article.title, article.read)
...:
14 Edge无法打开本地地址:127.0.0.1 14
13 生成文章摘要的两种方式 13
12 Django 渲染form 表单的一个错误 46
11 Django simple tag不生效 与模板继承 13
8 分页功能实现 38
3 Django media配置的套路 16
方式二:使用raw
In [13]: articles = models.Article.objects.raw("select id, title, read from blog_article where id>2 and read>10")
In [14]: for article in articles:
...: print(article.id, article.title, article.read)
...:
3 Django media配置的套路 16
8 分页功能实现 38
11 Django simple tag不生效 与模板继承 13
12 Django 渲染form 表单的一个错误 46
13 生成文章摘要的两种方式 13
14 Edge无法打开本地地址:127.0.0.1 14
方式三:直接执行sql
In [29]: from django.db import connection
In [30]: cursor = connection.cursor()
In [31]: cursor.execute("select id, title, read from blog_article where id>2 and read>10")
Out[31]: <django.db.backends.sqlite3.base.SQLiteCursorWrapper at 0x7fb24ab10558>
In [32]: articles = cursor.fetchall()
In [33]: articles
Out[33]:
[(3, 'Django media配置的套路', 16),
(8, '分页功能实现', 38),
(11, 'Django simple tag不生效 与模板继承', 13),
(12, 'Django 渲染form 表单的一个错误', 46),
(13, '生成文章摘要的两种方式', 13),
(14, 'Edge无法打开本地地址:127.0.0.1', 14)]
这三种方式仅用于参考,但实际上很多公司并不使用django的ORM,觉得它效率低,而是自己写sql,所以熟悉sql非常重要。