问题:模块写完后数据库插入了近一百万条数据,结果orm的查询方法当然就拖不起,慢的一匹
解决方法:先将数据库中经常查询的哪些建索引如图:

嗯哼然后呢在进入我们的项目把orm的查询改成原生的sql
先上表格渲染部分的吧
def api_back_news(request):
# 资讯列表(包含分页、搜索、日期筛选)
if request.method == 'GET':
# 获取游标对象
cursor = connection.cursor()
# 获取分页(没有分页就默认第一页)
page = int(request.GET.get('page', 1))
# 一页多少条
limit = int(request.GET.get('limit', 10))
# 获取所有的数据
data = find_data(cursor,
f'select * from (select id from quick_poll_alerts order by alerts_releasetime desc limit '
f'{(page - 1) * limit},{limit}) a left join quick_poll_alerts b on a.id=b.id')
# 用原生sql查询总数
cursor.execute(f'select count(*) from quick_poll_alerts')
# 获取所有的数据
count = cursor.fetchall()
# 关闭游标
cursor.close()
return JsonResponse({'code': 200, 'data': data, 'count': count})
#这里是分页
if request.method == 'POST':
if request.POST.get('page') != None:
cursor = connection.cursor()
page = int(request.POST.get('page', 1))
limit = int(request.POST.get('limit', 10))
data = find_data(cursor,
f'select * from (select id from quick_poll_alerts order by alerts_releasetime desc limit '
f'{(page - 1) * limit},{limit}) a left join quick_poll_alerts b on a.id=b.id')
cursor.execute(f'select count(*) from quick_poll_alerts')
count = cursor.fetchall()
cursor.close()
print(data)
return JsonResponse({'code': 200, 'data': data, 'count': count})
你会发现有一个find_data,这个呢是吧我格式化sql输出,简单的说就是把输出的数据变成我想要的格式,由于前端的数据字段和数据库的数据字段不一样所以我查询拼了一下
def find_data(cursor, sql):
# 格式化sql输出
cursor.execute(sql)
res = cursor.fetchall()
# label和文章是多对多的表所以需要查询出label重新赋值
list = []
for r in res:
data1 = {}
cursor.execute(f'select quick_poll_alerts.id, quick_poll_label.* '
f'from quick_poll_alerts, quick_poll_label, quick_poll_alerts_label '
f'where quick_poll_alerts.id=quick_poll_alerts_label.alerts_id '
f'and quick_poll_label.id=quick_poll_alerts_label.label_id '
f'and quick_poll_alerts.id={r[0]};')
list1 = cursor.fetchall()
labels = [l[2] for l in list1]
data1['id'] = r[0]
data1['img'] = r[4]
data1['labels'] = labels
data1['title'] = r[13]
data1['regional'] = r[8]
data1['source'] = r[11]
data1['total_views'] = r[10]
data1['time'] = r[12].strftime("%Y-%m-%d")
list.append(data1)
return list
当然 如果前后端的数据字段一样 那就可以直接
def find_data(cursor, sql):
# 处理sql
cursor.execute(sql)
# 获取所以的数据
res = cursor.fetchall()
# 获取数据字段
description = cursor.description
# 循环出数据字段
columns = [i[0] for i in description]
# 返回格式为{'字段': 数据, '字段2': 数据2}
return [dict(zip(columns, r)) for r in res]
嗯嗯没了 加油 百度其实都可以解决的
网友评论