django -----原生SQL语句查询与前端数据传递
2017-10-23 23:07
561 查看
1.使用原生SQL语句远程链接MySQL
view.py中
---
import MySQL
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()
]
修改一下代码
然后 print(values)
-----------------------------------------------------
[{'phone': u'133333333333', 'id': 1L, 'expected_date': datetime.datetime(2017, 10, 16, 0, 0), 'uname': u'\u5f20\u79d1'}]
------------------------------------------
已经变成dict类型了
在html中可以用template自带的方法引用
3.转化为json格式给js用
view.py中,改一行代码即可
用json.dumps()处理一下values
print一下results的结果
4000
----------------------------------------------------
[{"phone": "13333333333", "id": 1, "expected_date": "datetime.datetime(2017, 10, 16, 0, 0)", "uname": "\u5f20\u79d1"}]
--------------------------------------------------
可以看到单引号变成了双引号,python用的标识u、L消去了。
4.处理错误的datetime.datetime
定义好之后
再在刚才json.dumps()的地方改一下
print可以看到results现在已经显示正确的时间格式
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"}]
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的结果
4000
----------------------------------------------------
[{"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"}]
相关文章推荐
- 18.Django原生SQL语句查询返回字典
- SQL语句实现跨Sql server数据库操作实例 - 查询远程SQL,本地SQL数据库与远程SQL的数据传递
- 用@Query标注自定义查询语句用原生sql查询符合时间要求的数据与分页等功能
- sql 语句查询今天、昨天、近7天、近30天、一个月内、上一月 数据
- [数据库] SQL查询语句表行列转换及一行数据转换成两列
- Hibernate 中应用原生SQL语句查询
- PB数据窗口sql语句中like后面怎么跟变量模糊查询
- 发现CakePHP传递到Controller时数据值是对的,但是输出SQL语句后发现那个值一直是“1”
- SQL中统计数据的查询语句写法
- SQL SERVER中查询当天、当月、当年数据的SQL语句
- SQL语句的TOP和ORDER BY查询到的数据比预想的还多?
- 一条SQL语句查询无限递归树所有数据
- SQl 跨服务器查询语句和跨数据创建表
- SQL中查询数据表字段名称的查询语句
- SQLServer中查询表结构(表主键 、列说明、列数据类型、所有表名)的Sql语句
- Oracle中针对层次数据所设计的专用SQL查询语句
- oracel sql语句:查询时间段中开始时间与结束时间相同的数据
- sql语句实现从一个表的查询出某些数据插入另外一个表中
- SQL 数据查询语句
- oracle 查询重复数据并且删除, 只保留一条数据的SQL语句