如何根据烧瓶中的条件查询所有列

时间:2020-08-14 05:04:48

标签: python flask flask-sqlalchemy

我有这样的功能:

python evaluate.py --checkpoint ./rain_princess.ckpt --in-path image.jpg --out-path ./output_image.jpg

当我执行上面的函数时,它将带有如下参数:

  def dbquery(find_by_entry, start_date, end_date):
          start_date = str(datetime.strptime(start_date, format('%Y-%m-%d')))
          new_end_date = str(datetime.strptime(end_date, format('%Y-%m-%d')) + timedelta(days=1))
          data = Analytics.query.filter(Analytics.created_date.between(start_date, new_end_date)).filter_by(id=find_by_entry).order_by(desc('created_date')).all()
          data_schema = AnalyticsSchema(many=True).dump(data)
          return data_schema

,它将返回以下输出:

        dbquery('1', '2020-04-20', '2020-06-20)

但是如果我为find_by_entry传递多个值,例如:

         [{'id:1' , 'name' :'XXX' }, {'id:1' , 'name' :'YYY'}, ...]

我可以将“ data”变量放入循环中,但这是问题,对于“ id:1”,可能有多个记录或单个记录,但是我希望所有内容都在单个列表中:

我已经为满足以上要求尝试了以下代码:

        ['1','2', '3', '4']

我正在调用如下函数

     def dbquery(find_by_entry, start_date, end_date):
          empty_list = []
          start_date = str(datetime.strptime(start_date, format('%Y-%m-%d')))
          new_end_date = str(datetime.strptime(end_date, format('%Y-%m-%d')) + timedelta(days=1))
          for i in find_by_entry:
               data = Analytics.query.filter(Analytics.created_date.between(start_date, new_end_date)).filter_by(id=i).order_by(desc('created_date')).all()
               data_schema = AnalyticsSchema(many=True).dump(data)
               empty_list.append(data_schema)
          return empty_list

      

当前输出:

     dbquery(['1','2', '3', '4'], '2020-04-20', '2020-06-20)

预期输出:

      [[{'id:1' , 'name' :'XXX' }, {'id:1' , 'name' :'YYY'}, ...], [{'id:2' , 'name' :'XXX' }, {'id:2' , 'name' :'YYY'}, ...], [{'id:3' , 'name' :'XXX' }, {'id:3' , 'name' :'YYY'}, ...], [{'id:4' , 'name' :'XXX' }, {'id:4' , 'name' :'YYY'}, ...]]

注意:

       [{'id:1' , 'name' :'XXX' }, {'id:1' , 'name' :'YYY'}, {'id:2' , 'name' :'XXX' }, {'id:2' , 'name' :'YYY'}, {'id:3' , 'name' :'XXX' }, {'id:3' , 'name' :'YYY'}, {'id:4' , 'name' :'XXX' }, {'id:4' , 'name' :'YYY'} ]

2 个答案:

答案 0 :(得分:0)

有两种方法可以解决此问题。首先,您要附加列表而不是扩展列表,因此以下内容应适用于该结构:

def dbquery(find_by_entry, start_date, end_date):
      empty_list = []
      start_date = str(datetime.strptime(start_date, format('%Y-%m-%d')))
      new_end_date = str(datetime.strptime(end_date, format('%Y-%m-%d')) + timedelta(days=1))
      for i in find_by_entry:
           data = Analytics.query.filter(Analytics.created_date.between(start_date, new_end_date)).filter_by(id=i).order_by(desc('created_date')).all()
           data_schema = AnalyticsSchema(many=True).dump(data)
           empty_list.extend(data_schema) # Note here
      return empty_list

第二件事是,您可以在一个查询中轻松完成所有操作,这是更快,更易于理解和更好的实践:

def dbquery(find_by_entry, start_date, end_date):
      start_date = str(datetime.strptime(start_date, format('%Y-%m-%d')))
      new_end_date = str(datetime.strptime(end_date, format('%Y-%m-%d')) + timedelta(days=1))
      for i in find_by_entry:
      data = Analytics.query.filter(
          Analytics.created_date.between(start_date, new_end_date),
          Analytics.id.in_(find_by_entry)
      ).order_by('id', desc('created_date')).all()
      data_schema = AnalyticsSchema(many=True).dump(data)
      return data_schema

答案 1 :(得分:0)

您是否曾尝试在文件analytics_schema中添加更多需要返回的字段?在文件analytics_schema中如下所示:

class AnalyticsSchema(Schema):
 class Meta:
    strict = True
    ordered = True

 id = fields.Int()
 name = fields.String() 


analytics_schema = AnalyticsSchema()

然后可以这样使用:

analytics_schema.dump(data).data