Django使用原生sql的三种方式

通常情况下,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非常重要。

上一篇:数据库连接池

下一篇:salt-stack简单使用