免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7338 | 回复: 8
打印 上一主题 下一主题

请问在django写原生sql语句,怎么以字典的形式返回?现在都是以tuple的形式返回 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-06 09:50 |只看该作者 |倒序浏览
import MySQLdb


cursor = connection.cursor()
cursor.execute(" SELECT * FROM  "+tablename+" where id != 0 ")
row=cursor.fetchall()

以上这种是手册上写的,可以用,只不过返回的是tuple,在模板里只能用下标引用,row[0],row[1]这种,很不方便

网上搜到一种方法:

cursor = connection.cursor()
   cursor.EXECUTE('''SELECT CAST(AVG( complete_speed ) as decimal(10,2)) as  complete_speed,
        CAST(AVG( complete_quality ) as decimal(10,2)) as  complete_quality  ,
        CAST(AVG( work_bearing ) as decimal(10,2)) as  work_bearing ,
        be_marked_user_id , u.first_name , CAST(AVG((complete_speed+complete_quality+work_bearing)/3) as decimal(10,2)) as average
        FROM mark_pointresult r left join auth_user u
        on u.id=r.be_marked_user_id
        GROUP BY be_marked_user_id''')
    DESC = cursor.description
    DATA = [dict(zip([col[0] FOR col IN DESC], ROW)) FOR ROW IN cursor.fetchall()]

但是这种方法报错,无法使用


请问到底正确的写法是怎样的,就是结果弄成字典,像这样的row['name'],非常感谢!!!

论坛徽章:
0
2 [报告]
发表于 2011-07-06 10:50 |只看该作者
本帖最后由 106033177 于 2011-07-06 10:51 编辑

回复 1# zcxey2911

不知道row['name']比row[0]方便在哪儿。
变通一下可以这样。
  1. cursor = connection.cursor()
  2. cursor.execute(" SELECT * FROM  "+tablename+" where id != 0 ")
  3. fields = dict([(field[0],cursor.description.index(field)) for field  in  cursor.description])
  4. row=cursor.fetchall()
  5. for r in row:
  6.     print r[fields['name']]
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-07-06 11:16 |只看该作者
非常感谢

论坛徽章:
0
4 [报告]
发表于 2011-07-06 17:50 |只看该作者
MySQLdb本身就支持返回dict格式
cursor = connect.cursor(MySQLdb.cursors.DictCursor)

论坛徽章:
0
5 [报告]
发表于 2011-07-07 08:58 |只看该作者
楼上,你说的是独立的python,不是django框架,django的db类封装的让人很蛋疼,那个类不允许传参数

论坛徽章:
0
6 [报告]
发表于 2011-07-07 09:49 |只看该作者
本帖最后由 106033177 于 2011-07-07 09:50 编辑

回复 4# flying_away
connect.cursor(MySQLdb.cursors.DictCursor) dbapi标准是不支持这个东东的。在django里要这样用的话我估计恐怕的修改django的mysql 数据库后端。

论坛徽章:
0
7 [报告]
发表于 2011-07-07 09:51 |只看该作者
{:3_196:}原来这么麻烦

论坛徽章:
0
8 [报告]
发表于 2011-07-14 15:36 |只看该作者
无聊,你觉得这样会对你有什么好处吗,你在row[0]注释一下‘name’不是更完美
不要一味的达到dict,这样sql执行会受影响的。数据少可能感觉不出,如果数据一多,肯定立马表现出来

论坛徽章:
0
9 [报告]
发表于 2011-07-14 17:13 |只看该作者
使用row['name']的最大好处就是不用理会SQL语句中字段的顺序关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP