Sqlalchemy 中count函数的坑

来源:互联网 发布:成立子公司的好处知乎 编辑:程序博客网 时间:2024/05/17 22:44

最近项目中用了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 <rest of query follows...>) 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=<cmdb_port_scan>, primary_key=True, nullable=False),))

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



原创粉丝点击