前言
Hey,各位小伙伴,这次怎么来玩一下,如何使用Django执行原生SQL。
我们都知道,Python在web界的扛把子——Django,可谓是集大成为统一,各种各样的插件、forms组件、model模型、Admin后台等等,后面我会专门出文章娓娓道来,反正就是一个字,NB。
本次就来学一下,如何在Django执行原生语句。
起因
在使用Django时,一般情况下,我们使用Django自带的model查询是没有问题的,基本能满足80%的问题
但是,但是,那20%就不要了吗"htmlcode">
class Book(models.Model): title = models.CharField(verbose_name="书名", max_length=32) describe = models.TextField(verbose_name="描述") author = models.CharField(verbose_name="作者", max_length=32) publisher = models.CharField(verbose_name="出版社", max_length=32) publisher_date = models.DateField(verbose_name="publisher")
就是一个很简单的图书表
通过admin录入一些数据测试使用
extra方式
强烈建议,不用学,没毛用
raw方式
这个相比较extra,还是比较有用的,
语法如下
models.表名.objecs.raw(sql) models.表名.objecs.raw(sql,[参数1,参数2])
注:如果没有参数,就只写sql语句,如果由参数,后面需要用列表,如图所示
举例
返回的仍然一个个的Book对象
真正的原生sql方式
上述的,其实还是和django的model有些绑定。但是我就是说,我就是想要原生sql,不要跟任何绑定。
这里说一下,千万不要在django使用pymysql执行原生sql,会发生一些奇怪的问题。一定要导入from django.db import connection执行sql。代码如下:
from django.db import connection def book_list(request): # 真正的原生sql, cursor = connection.cursor() print(type(cursor)) cursor.execute("select * from app01_book where id=%s", [1, ]) raw = cursor.fetchall() print(raw)
返回内容如下图所示:
可以看到,返回的是列表里面套一个个的数组。我就在想,有没有什么办法能将查询出来的sql,直接返回成字典呢"htmlcode">
def query_all_dict(sql, params=None): ''' 查询所有结果返回字典类型数据 :param sql: :param params: :return: ''' with connection.cursor() as cursor: if params: cursor.execute(sql, params=params) else: cursor.execute(sql) col_names = [desc[0] for desc in cursor.description] row = cursor.fetchall() rowList = [] for list in row: tMap = dict(zip(col_names, list)) rowList.append(tMap) return rowList
一个是查询一个,代码如下所示:
def query_one_dict(sql, params=None): """ 查询一个结果返回字典类型数据 :param sql: :param params: :return: """ with connection.cursor() as cursor: if params: cursor.execute(sql, params=params) else: cursor.execute(sql) col_names = [desc[0] for desc in cursor.description] row = cursor.fetchone() tMap = dict(zip(col_names, row)) return tMap
用法如下,直接在视图中调用函数
返回结果如下,直接是列表套字典格式
那查询带条件的怎么办哪,其实和pymysql一个样
返回结果
但是有个问题,上面的查询,我们明明知道,让只会返回一个值,但是还是返回的是列表套字典格式,似乎不太对呐"text-align: center">
上述总结
django中执行原生sql有3种方式,extra,raw,from django.db import connection
其中extra基本没用,raw凑合,但是和models有绑定,connection最灵活,但是默认返回的是[tuple,tuple,tuple,]格式
经过改良,封装出两个方法,query_all_dict,query_one_dict,一个是查询多个,一个是查询单个,并且返回成[dict,dict,dict,]
建议
只使用query_all_dict,query_one_dict
项目代码
django_exec_sql.zip
需要本文完整代码的小伙伴,可以在本公众号后台回复关键字:原生SQL,进行获取。
总结
上述以入门的方式解决了安排了以下如何通过django执行原生sql。
用微笑告诉别人,今天的我比昨天强,今后也一样。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]