django -----原生SQL语句查询与前端数据传递


1.使用原生SQL语句远程链接MySQL


view.py中

---

import MySQL


def request_data(request):
    if request.method == "GET":
        conn = MySQLdb.Connect(
                host ='my_ip',
                port = 3306,
                user = 'my_user',
                passwd = 'my_passwd',
                db = 'my_db',
                charset = 'utf8'
        )
        cursor = conn.cursor()
        cursor.execute("select * from my_table limit 1")
	values=cursor.fetchall()
        cursor.close()
        conn.close()
        return render(request,"data.html",{'results':values})


print(values)

------------------

((1L, u'\u2320\u2131', u'13333333333333', datetime.datetime(2017, 10, 16, 0, 0)))

------------------

此时返回的values是tuple类型



2.将sql返回的value转化为dict类型



原文地址 http://www.yihaomen.com/article/python/250.htm
------------------------


程序代码 程序代码

def dictfetchall(cursor):
    "将游标返回的结果保存到一个字典对象中"
    desc = cursor.description
    return [
    dict(zip([col[0] for col in desc], row))
    for row in cursor.fetchall()
    ]


修改一下代码

values = dictfetchall(cursor)


然后 print(values)

-----------------------------------------------------
[{'phone': u'133333333333', 'id': 1L, 'expected_date': datetime.datetime(2017, 10, 16, 0, 0), 'uname': u'\u5f20\u79d1'}]

------------------------------------------

已经变成dict类型了


在html中可以用template自带的方法引用


{% for item in results %}

                <li>{{item.phone}}</li>

            {%endfor%}


3.转化为json格式给js用


view.py中,改一行代码即可

用json.dumps()处理一下values

import json
return render(request,"data.html",{'results':json.dumps(values)})


print一下results的结果

----------------------------------------------------
[{"phone": "13333333333", "id": 1, "expected_date": "datetime.datetime(2017, 10, 16, 0, 0)", "uname": "\u5f20\u79d1"}]

--------------------------------------------------


可以看到单引号变成了双引号,python用的标识u、L消去了。



4.处理错误的datetime.datetime



import datetime

class MySQLEncoder(json.JSONEncoder):
    def default(self,obj):
        if isinstance(obj,datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj,date):
            return obj.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self,obj)


定义好之后


再在刚才json.dumps()的地方改一下

return render(request,"data.html",{'results':json.dumps(values,cls=MySQLEncoder)})


print可以看到results现在已经显示正确的时间格式

[{"phone": "13333333333", "id": 1, "expected_date": "2017-10-16 00:00:00", "uname": "\u5f20\u79d1"}]



5.处理decimal('x')  is not JSON serializable

decimal数据不能转化为json序列的问题


mysql原生查询出来的数据,很多都是decimal类型。默认状态下json不能识别。

-----
import decimal

class MySQLEncoder(json.JSONEncoder):
    def default(self,obj):
        if isinstance(obj,datetime.datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj,datetime.date):
            return obj.strftime('%Y-%m-%d')
        elif isinstance(obj, decimal.Decimal):
            return str(obj)
        else:
            return json.JSONEncoder.default(self,obj)
----------------------
修改刚才的DateEncoder类如上,主要加了一行匹配decimal.Decimal的语句
当发现mysql返回了decimal数据时,调用str()方法,将Decimal('x')中的x以字符串形式返回。


现在修改返回html的语句
---------------------------------------------
return render(request,"data.html",{'results':json.dumps(values,cls=MySQLEncoder)})
--------------------------------------------


没有被json.dump之前的数据
------------------------------
[{'tx': Decimal('2600'), 'num': 10L, "add_ate": u'2017-09-20', 'ff': Decimal('9800'), 'onum': 17L}]
---------------------------------

json.dump之后
------------------------
[{'tx': "2600","...","..."}]
------------------------

--------------方法2---------------------

继承decimal.Decimal,重定义Decimal

class Decimal(decimal.Decimal):
    def __init__(self,name):
        self.val = name


然后

 elif isinstance(obj, decimal.Decimal):
            return obj.val

------------------------------------------
运行实例

print(json.dumps([{'aa':Decimal('3.13')}],cls=MySQLEncoder))

成功获得
[{"aa":"3.13"}]





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值