小知识

作者: 西北望高楼 | 来源:发表于2021-01-20 20:00 被阅读0次

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 <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()即可

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

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

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

相关文章

  • 开发小知识(一)

    开发小知识(一) 开发小知识(一)

  • 小知识

    夏天来了,格式冰冻的饮品也都上市了,什么冰激凌,炒冰,格式各样五花八门,我们要知道冰冻食物温度是0摄氏度,而我们人...

  • 小知识

    1字母默认大写的问题 以前了布局文件里定义一个text为字母的时候,很烦人的,它显示出来的默认就是大写,好烦人。今...

  • 小知识

  • 小知识

    气们不听话,一直雨加雪,她呼出一口热气,还有半小时锅就煮开了。 她去洗澡,水声隐隐想起一首歌,跟着哼唱。 她再回厨...

  • 小知识

    按住鼻翼两侧可以止住打喷嚏。 头发顺着发根到发梢的方向洗会柔顺很多。 鞋垫经常拿出来晾一晾可以...

  • 小知识

    #微协小分享# 今天微协君在桂花树上看到了一种果子,第一次见到它的微协君表示很神奇。原来这种果子叫桂花果[并不简单...

  • 小知识

    瓶装饮料扭不开怎么办,拍几下瓶底就可以轻松扭开,因为拍瓶底就会有小气泡冒出在整个瓶子里面会产生挤压里使瓶盖向上挤压...

  • 小知识

    1.元宵节:Lantern Festival 2.刺绣:Embroidery 3.重阳节:Double-Ninth...

  • 小知识

    LNMP LNMP = Linux + Nginx + Mysql + PHP LAMP LAMP = Linux...

网友评论

      本文标题:小知识

      本文链接:https://www.haomeiwen.com/subject/wrclzktx.html