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

来源:互联网 发布:sql字符串中的单引号 编辑:程序博客网 时间:2024/06/04 23:26

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 datetimeclass 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"}]