Django中ORM如何执行原生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)
作者:piggthird
出处:https://www.cnblogs.com/piggthird/p/17831038.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用