当查询更改为json

时间:2018-01-09 06:39:21

标签: python sql flask sqlalchemy flask-sqlalchemy

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

我有两个问题。

首先,当我使用offsetlimit时,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'}]

在打印第4个查询的行中,您可以看到它有三个选择查询。我在该查询之前使用了offsetlimit

在打印'before loop'之后,打印下一行大约需要1秒钟。

如果使limit为50,则需要将近3秒钟。

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

为什么会这样?

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

请帮我解决这个问题。

欢迎任何想法或任何链接。

提前致谢。

1 个答案:

答案 0 :(得分:1)

对于偏移和限制,查询实际上是正常的。这是做出抵消和限制的唯一方法。

此查询和dict创建代码不应该很慢,在其他地方搜索丢失的时间。在打印(datetime())中包含疑似慢速语句,以查看它们占用了多少。