小知识

1. 让指定字段按照给定的值进行排序

``` 

temp_query= db.session.query(TemplateBuild).filter(

    TemplateBuild.deploy_id== deploy_id,

    TemplateBuild.env.in_(envs),

    TemplateBuild.delete== 0

).order_by(case(value=TemplateBuild.env, whens={'prod': 1, 'staging': 2, 'test': 3, 'dev': 4}))

# 多不同字段排序

# order_by(case(

#    (

#        (TemplateDeploy.name == 'prod', 1),

#        (TemplateDeploy.env == 'staging', 2),

#        (TemplateDeploy.compiled == 'Server', 3)

#    ))

# )

```


原文链接:https://blog.csdn.net/u010311062/article/details/76268783

最近项目中用了Sqlalchemy orm,开始数据不多的时候用coun()函数不会慢,但是当数据到百万级的时候,filter_obj.count()来获取数据总数,就明显感觉慢了。

看官方API的描述:

count ( )

Return a count of rows this Query would return.

This generates the SQL for this Query as follows:

SELECT count(1) AS count_1 FROM (

    SELECT

) AS anon_1

这里会临时建一个表把数据查询出来然后在count

我在数据库中对这种count的计时比较:

那么我们如何解决这个问题呢。

我们可以利用func.count来处理统计总数的

这里要用到Sqlalchemy的函数with_entities来重置查询

意思就是我们可以这样做

filter_obj = session.quert(User).filter(User.id>23)

data = filter_obj[0:10]

total = filter_obj.with_entities(func.count(User.id)).scalar()

然而还有一个问题。我这里已经将查询封装在框架里面了。我并不能保证每个model的主键都是id

所以,这里要获取到传进来的model的主键

from sqlalchemy import inspect

ins = inspect(self.model)

pk = ins.primary_key[0]       

primary_key返回的是一个元组,我们这里支取第一个,此时pk返回的是Column类型,('Tuple of primary keys: ', (Column('id', Integer(), table=, primary_key=True, nullable=False),))

这里我们将查询改为filter_obj.with_entities(func.count(pk)).scalar()即可

————————————————

版权声明:本文为CSDN博主「moses涛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u010311062/article/details/76268783

你可能感兴趣的:(小知识)