代码之家  ›  专栏  ›  技术社区  ›  Canet Robern Icycool

当查询更改为json时,我的python代码需要很长时间才能获取列表

  •  -2
  • Canet Robern Icycool  · 技术社区  · 7 年前

    我正在使用Flask SQLAlchemy,我刚刚开始python编程。

    我有两个问题。

    首先,当我使用 offset limit , print 显示了一个长查询。

    第二,当将查询转换为json数据时,这些查询需要太多时间。

    请查看我的代码。

        @classmethod
            def get_admin_product_list(cls, request):
                with giftCenter.session_scope() as session:
    
                    products = session.query(Product.goods_id,
                                             Product.goods_name,
                                             Product.brand_id,
                                             Product.price,
                                             Product.disc_price,
                                             Product.goods_image_id,
                                             Product.goods_desc,
                                             Product.sb_brand_id,
                                             Product.id,
                                             Product.goods_brand_name,
                                             Product.link_company_id,
                                             Product.is_use)
    
                    print('-----1st query-----')
                    print(products)
                    print('')
    
                    if 'query' in request:
                        query = json.loads(request['query'])
                        filters = query['filters']
                        for key, value in filters.items():
                            try:
                                products = products.filter(getattr(Product, key).ilike("%" + str(value) + "%"))
                            except AttributeError:
                                pass
    
                    print('-----2nd query-----')
                    print(products)
                    print('')
    
                    total_cnt = products.count()
    
                    order_by = desc('goods_id')
    
                    if 'sortField' in request and 'sortDir' in request:
                        if request['sortField'] is not None and request['sortDir'] == 'desc':
                            order_by = desc(request['sortField'])
                        elif request['sortField'] is not None and request['sortDir'] == 'asc':    
                            order_by = asc(request['sortField'])
    
                    print(order_by)
                    print('')
    
                    products = products.order_by(order_by)
    
                    print('-----3rd query-----')
                    print(products)
                    print('')
    
                    if 'page' in request:
                        page = 1
                        limit = 10
    
                        if 'page' in request:
                            if type(request['page']) == int or request['page'] is not 0:
                                page = int(request['page'])
                        if 'limit' in request:
                            if type(request['limit']) == int or request['limit'] is not 0:
                                limit = int(request['limit'])
                        if 'offset' in request:
                            if type(request['offset']) == int:
                                offset = int(request['offset'])
                            else:
                                offset = (page - 1) * limit
                        else:
                            offset = (page - 1) * limit
    
                        print(offset, limit)
                        # products = products.slice(offset, limit)
                        products = products.offset(offset).limit(limit)
    
                    print('-----4th query-----')
                    print(products)
                    print('')
    
                    data = []
    
                    print('-----before for loop-----')
                    print('')
    
                    for product in products:
                        print(product)
                        obj = {
                            "goods_id": product.goods_id,
                            "goods_name": product.goods_name,
                            "brand_id": product.brand_id,
                            "price": product.price,
                            "disc_price": product.disc_price,
                            "goods_image_id": product.goods_image_id,
                            "goods_desc": product.goods_desc,
                            "sb_brand_id": product.sb_brand_id,
                            "id": product.id,
                            "goods_brand_name": product.goods_brand_name,
                            "link_company_id": product.link_company_id,
                            "is_use": product.is_use
                        }
                        data.append(obj)
    
                        ######## 2nd code
                        # obj = cls.dummy()
                        # setattr(obj, "goods_id", product.goods_id)
                        # setattr(obj, "goods_name", product.goods_name)
                        # setattr(obj, "brand_id", product.brand_id)
                        # setattr(obj, "price", product.price)
                        # setattr(obj, "disc_price", product.disc_price)
                        # setattr(obj, "goods_image_id", product.goods_image_id)
                        # setattr(obj, "goods_desc", product.goods_desc)
                        # setattr(obj, "sb_brand_id", product.sb_brand_id)
                        # setattr(obj, "id", product.id)
                        # setattr(obj, "goods_brand_name", product.goods_brand_name)
                        # setattr(obj, "link_company_id", product.link_company_id)
                        # setattr(obj, "is_use", product.is_use)
                        # data.append(obj.__dict__)
    
                    print('')
                    print(data)
    
                    return 0, "OK", data if len(data) else None, total_cnt
    

    这是我的打印日志

    -----1st query-----
    SELECT products.goods_id AS products_goods_id, products.goods_name AS products_goods_nam_1, products.brand_id AS products_bra_2, products.price AS products_price, products.disc_price AS products_disc_pric_3, products.goods_image_id AS products_goods_ima_4, products.goods_desc AS products_goods_des_5, products.sb_brand_id AS products_sb_brand__6, products.id AS products_id, products.goods_brand_name AS products_goods_bra_7, products.link_company_id AS products_link_comp_a, products.is_use AS products_is_use 
    FROM products
    
    -----2nd query-----
    SELECT products.goods_id AS products_goods_id, products.goods_name AS products_goods_nam_1, products.brand_id AS products_bra_2, products.price AS products_price, products.disc_price AS products_disc_pric_3, products.goods_image_id AS products_goods_ima_4, products.goods_desc AS products_goods_des_5, products.sb_brand_id AS products_sb_brand__6, products.id AS products_id, products.goods_brand_name AS products_goods_bra_7, products.link_company_id AS products_link_comp_a, products.is_use AS products_is_use 
    FROM products
    
    goods_id DESC
    
    -----3rd query-----
    SELECT products.goods_id AS products_goods_id, products.goods_name AS products_goods_nam_1, products.brand_id AS products_bra_2, products.price AS products_price, products.disc_price AS products_disc_pric_3, products.goods_image_id AS products_goods_ima_4, products.goods_desc AS products_goods_des_5, products.sb_brand_id AS products_sb_brand__6, products.id AS products_id, products.goods_brand_name AS products_goods_bra_7, products.link_company_id AS products_link_comp_a, products.is_use AS products_is_use 
    FROM products ORDER BY products.goods_id DESC
    
    0 10
    
    -----4th query-----
    SELECT products_goods_id, products_goods_nam_1, products_bra_2, products_price, products_disc_pric_3, products_goods_ima_4, products_goods_des_5, products_sb_brand__6, products_id, products_smartcon__7, products_smartcon__8, products_goods_bra_9, products_link_comp_a, products_is_use 
    FROM (SELECT products_goods_id, products_goods_nam_1, products_bra_2, products_price, products_disc_pric_3, products_goods_ima_4, products_goods_des_5, products_sb_brand__6, products_id, products_smartcon__7, products_smartcon__8, products_goods_bra_9, products_link_comp_a, products_is_use, ROWNUM AS ora_rn 
    FROM (SELECT products.goods_id AS products_goods_id, products.goods_name AS products_goods_nam_1, products.brand_id AS products_bra_2, products.price AS products_price, products.disc_price AS products_disc_pric_3, products.goods_image_id AS products_goods_ima_4, products.goods_desc AS products_goods_des_5, products.sb_brand_id AS products_sb_brand__6, products.id AS products_id, products.goods_brand_name AS products_goods_bra_7, products.link_company_id AS products_link_comp_a, products.is_use AS products_is_use 
    FROM products ORDER BY products.goods_id DESC) 
    WHERE ROWNUM <= :param_1 + :param_2) 
    WHERE ora_rn > :param_2
    
    -----before for loop-----
    
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    ('blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah', 'blah')
    
    [{'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}, {'goods_brand_name': 'blah', 'is_use': 'blah', 'brand_id': 'blah', 'link_company_id': 'blah', 'disc_price': 'blah', 'id': 'blah', 'goods_name': 'blah', 'price': 'blah', 'goods_desc': 'blah', 'goods_id': 'blah', 'goods_image_id': 'blah', 'sb_brand_id': 'blah'}]
    

    在打印第四个查询的行中,您可以看到它有三个select查询。我刚用过 抵消 限度 在该查询之前。

    打印“前循环”后,大约需要1秒钟才能打印下一行。

    当if制作 限度 50,然后大约需要3秒钟。

    为了减少花费时间,我已经放弃了5个专栏,但这还不够。

    为什么会这样?

    我错过了什么?我不知道。

    请帮我解决这个问题。

    欢迎任何想法或链接。

    提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   hamilyon    7 年前

    至于偏移和限制,查询实际上是可以的。这只是oracle进行偏移和限制的方法。

    这个查询和dict创建代码不应该太慢,在其他地方搜索丢失的时间。在打印(datetime())中围绕可疑的慢语句,查看它们占了多少。