Django ORM 使用原生 SQL语句执行sql数据库操作

django中的ORM提供的操作功能有限,在模型提供的查询API不能满足实际工作需要时,可以在ORM中直接执行原生sql语句。

Django 提供两种方法使用原生SQL进行查询:一种是使用raw()方法,进行原生SQL查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。另外就是用extra方法。

1.raw方法

# row方法:(掺杂着原生sql和orm来执行的操作)
res = CookBook.objects.raw('select id as nid  from  epos_cookbook  where  id>%s', params=[1, ])
print(res.columns) # ['nid']
print(type(res)) # <class 'django.db.models.query.RawQuerySet'>

# 在select里面查询到的数据orm里面的要一一对应
res = CookBook.objects.raw("select * from epos_cookbook")
print(res)
for i in res:
    print(i.create_date)
    print(i)

res = CookBook.objects.raw('select * from epos_cookbook where id>%s', params=[1, ])
# 后面可以加参数进来
print(res)
for i in res:
    # print(i.create_date)
    print(i)

2.connection方法

from django.db import connection, connections
# 需要配置数据库
# cursor=connection['default'].cursor() 
cursor = connection.cursor()  
# 不传参数的情况
cursor.execute("""select  * from epos_cookbook""")

# 为原生sql语句设置参数的情况
# cursor.execute("""select  * from  epos_cookbook   where   id=%s""",[2,]) # 2 是 id
# cursor.execute("""select  * from  api_userinfo   where   id=%s"""%1)

# 防止注入攻击
cursor.execute("select  * from  epos_cookbook   where   id=%s", params=[1, ])
# row=cursor.fetchone()
# row=cursor.fetchmany()
row = cursor.fetchall()  ##拿到全部的数据

print(row)

3.extra方法

# (1,2) 必须两个以上
# res = CookBook.objects.extra(select={"aaa": "cook_type = 1"}, where=['id in (1,2)', ]).values()
res = CookBook.objects.extra(select={"aaa": "cook_type = 1"}, where=['id in (1,2)', ])
print(res)  # <QuerySet [<CookBook: 鱼香肉丝>, <CookBook: 水煮鱼>]>
for r in res:
    print(r)

参考:http://www.voidcn.com/article/p-yauakmva-bxq.html

posted on 2021-04-02 16:09  进击的davis  阅读(686)  评论(0编辑  收藏  举报

导航