-
Notifications
You must be signed in to change notification settings - Fork 0
/
query2dict.py
66 lines (56 loc) · 2.11 KB
/
query2dict.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from datetime import datetime as cdatetime # 有时候会返回datatime类型
from datetime import date, time
from flask_sqlalchemy import Model
from sqlalchemy.orm.query import Query
from sqlalchemy import DateTime, Numeric, Date, Time # 有时又是DateTime
def queryToDict(models):
if isinstance(models, list):
if isinstance(models[0], Model):
lst = []
for model in models:
gen = model_to_dict(model)
dit = dict((g[0], g[1]) for g in gen)
lst.append(dit)
return lst
else:
res = result_to_dict(models)
return res
else:
if isinstance(models, Model):
gen = model_to_dict(models)
dit = dict((g[0], g[1]) for g in gen)
return dit
else:
res = dict(zip(models.keys(), models))
find_datetime(res)
return res
# 当结果为result对象列表时,result有key()方法
def result_to_dict(results):
res = [dict(zip(r.keys(), r)) for r in results]
# 这里r为一个字典,对象传递直接改变字典属性
for r in res:
find_datetime(r)
return res
def model_to_dict(model): # 这段来自于参考资源
for col in model.__table__.columns:
if isinstance(col.type, DateTime):
value = convert_datetime(getattr(model, col.name))
elif isinstance(col.type, Numeric):
value = float(getattr(model, col.name))
else:
value = getattr(model, col.name)
yield col.name, value
def find_datetime(value):
for v in value:
if isinstance(value[v], cdatetime):
value[v] = convert_datetime(value[v]) # 这里原理类似,修改的字典对象,不用返回即可修改
def convert_datetime(value):
if value:
if isinstance(value, (cdatetime, DateTime)):
return value.strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(value, (date, Date)):
return value.strftime("%Y-%m-%d")
elif isinstance(value, (Time, time)):
return value.strftime("%H:%M:%S")
else:
return ""