美文网首页
django中用原生sql查询

django中用原生sql查询

作者: 叶叶阿姨 | 来源:发表于2020-01-08 14:01 被阅读0次

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


索引.png

嗯哼然后呢在进入我们的项目把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]

嗯嗯没了 加油 百度其实都可以解决的

相关文章

  • django中用原生sql查询

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

  • django 使用原生sql及分页

    python3 django 使用原生sql及分页 django 使用原生sql及分页,类似于django res...

  • Hibernate查询补充(基于注解)

    这里对Hibernate的查询作一个补充。 1.SQL原生查询 2.命名SQl查询 3.常见的锁 1.Sql原生查...

  • ThinkPHP查询

    查询方式 表达式查询 快捷查询 区间查询 组合查询 统计查询 动态查询 SQL查询 ThikPHP支持原生SQL查...

  • 查看Django ORM执行的SQL语句

    查询QuerySet对象执行的SQL语句 查询当前执行的SQL包括Django内置执行的多条执行的SQL语句

  • laravel查询总结

    Laravel 的 三种与数据库交互的方式: 原生sql 查询构造器 ORM 原生sql 总结:查询不够灵活,没有...

  • hibernate中的查询

    HQL 查询所有 条件查询 分页查询 Criteria 查询所有 条件查询 分页查询 查询总记录 原生SQL

  • Django中使用原生sql

    在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:...

  • Django SQL查询

    Manager.raw() 使用该方法进行SQL查询并返回一个django.db.models.query.Raw...

  • Laravel ORM

    查询指定键名 whereIn 解析能原生SQL是where in()

网友评论

      本文标题:django中用原生sql查询

      本文链接:https://www.haomeiwen.com/subject/qszjactx.html