摘要:介绍了在Django中使用原生sql语句的两种方法。

Django中可以以两种方式调用原生SQL语句,分别是raw()和execute(),这两种方式的主要区别体现在对SELECT操作的处理上。

raw()

raw()是数据库Manager的方法,默认的数据库Manager是objects。
假设有一个名为Test的model,则调用raw()的方法是:

Test.objects.raw("sql语句")

当通过Test.objects.raw()进行SELECT操作时,会返回QuerySet实例,QuerySet实例中包含了符合条件的Test object实例。

通过Test.objects.raw()进行SELECT查询有利有弊。

优点是可以最大化ORM的特性,由于返回值是QuerySet实例,可以很方便地对接QuerySet类的其他方法。

缺点是不够灵活,当进行连接查询时,当选中的属性不是Test类的属性时,Django无法返回值实例化为Test object,会抛出一个ValueError。

execute()

execute()是cursor对象的方法,可以用以下方法获取一个cursor:

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute('sql语句')

用execute()执行SELECT非常灵活,返回值是一个包含所有结果是list,缺点是无法对list中的tuple进一步使用ORM特性。