我正在使用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'}]
在打印第4个查询的行中,您可以看到它有三个选择查询。我在该查询之前使用了offset
和limit
。
在打印'before loop'之后,打印下一行大约需要1秒钟。
如果使limit
为50,则需要将近3秒钟。
我已经放弃了5个专栏来减少花费时间,但这还不够。
为什么会这样?
我错过了什么?我不知道。
请帮我解决这个问题。
欢迎任何想法或任何链接。
提前致谢。
答案 0 :(得分:1)
对于偏移和限制,查询实际上是正常的。这是做出抵消和限制的唯一方法。
此查询和dict创建代码不应该很慢,在其他地方搜索丢失的时间。在打印(datetime())中包含疑似慢速语句,以查看它们占用了多少。