首页 > 解决方案 > 尝试在 sqlachemy python 中按 date.today() 过滤时出现参数错误

问题描述

尝试按今天的日期过滤时出现 sqlalchemy.exc.ArgumentError

能够打印出日期 date.today() 但是当我将它与 sqlalchemy 一起使用时,它的抛出属性错误告诉一个约束是预期的

我试过的代码

def daily_Fitness() :
    result = Fitness.query.filter_by ( date.today () )

    for result in result :
        result.append ( {"Yoga" : Fitness.activity_type_1 , "Jogging" : Fitness.activity_type_2 ,
                         "Walking" : Fitness.activity_type_2 ,
                         "time" : Fitness.fitness_time ,
                         "comments" : Fitness.comments

                         } )
    return result

输出

Traceback (most recent call last):
  File "C:\Users\siveg\anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 124, in _init_items
    spwd = item._set_parent_with_dispatch
AttributeError: 'datetime.date' object has no attribute '_set_parent_with_dispatch'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:/Users/siveg/gitProject/python-project-template/python-project-template/application/models.py", line 10, in <module>
    class Food(db.Model) :
  File "C:/Users/siveg/gitProject/python-project-template/python-project-template/application/models.py", line 16, in Food
    date=db.Column (date.today(), unique=True , nullable=False )
  File "C:\Users\siveg\anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 1636, in __init__
    self._init_items(*args)
  File "C:\Users\siveg\anaconda3\lib\site-packages\sqlalchemy\sql\schema.py", line 126, in _init_items
    util.raise_(
  File "C:\Users\siveg\anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 211, in raise_
    raise exception
sqlalchemy.exc.ArgumentError: 'SchemaItem' object, such as a 'Column' or a 'Constraint' expected, got datetime.date(2021, 7, 27)

代码说明

假设为当前日期获取该特定表的数据

预期产出

Able to successfully fetch the data entered from the table as specified
{"Yoga" : Fitness.activity_type_1 , "Jogging" : Fitness.activity_type_2 ,
                         "Walking" : Fitness.activity_type_2 ,
                         "time" : Fitness.fitness_time ,
                         "comments" : Fitness.comments}

标签: pythonsqlalchemy

解决方案


filter_by期望关键字参数,其关键字是列名,整个值是要过滤的。

所以在这种情况下,如果你有一个像这样的表:

from datetime import date
class FitnessRoutine(Base):
   __tablename__ = 'fitness_routines'
   id = Column(Integer, primary_key=True, index=True)
   scheduled_on = Column(Date, default=date.today)

您将传递filter_by列的名称scheduled_on

routines_for_today = FitnessRoutine.query.filter_by(scheduled_on=date.today())

https://docs.sqlalchemy.org/en/14/orm/query.html#sqlalchemy.orm.Query.filter_by


推荐阅读