【问题标题】:Flask SQLAlchemy between query return empty list查询之间的 Flask SQLAlchemy 返回空列表
【发布时间】:2020-02-17 17:35:29
【问题描述】:

我刚开始使用 Flask SQLAlchemy,我在这里查看了我应该如何进行查询,所以我找到了this

但我遇到的问题是它在执行时返回以下内容:

SELECT records.id AS records_id, records.created_at AS records_created_at, records.file_type AS records_file_type, records.path_filename AS records_path_filename 
FROM records 
WHERE records.created_at BETWEEN ? AND ?

代码:

today_date = datetime.today().strftime("%d/%m/%Y")
week = (datetime.today() - timedelta(days=7)).strftime("%d/%m/%Y")
month = (datetime.today() - timedelta(days=30)).strftime("%d/%m/%Y")

last_30_days = db.session.query(Records).filter(Records.created_at.between(month, today_date))

当我在 last_30_days 表达式的末尾添加 .all() 时,它会返回一个空列表。

我还要提一下,当我使用相同的表达式查询星期时,today_date 会得到所有结果。

这就是表格的样子:

class Records(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    created_at = (db.Column(db.String(20), nullable=False))
    file_type = (db.Column(db.String(100), nullable=False))
    path_filename = db.Column(db.String(120), unique=True, nullable=False)

谁能给我解释一下这是怎么回事?谢谢!

【问题讨论】:

  • 因为您正在进行字符串比较,而不是日期时间比较。如果您希望对字符串进行<> 比较有意义,则需要ISO 格式的时间。例如,“YYYY-MM-DD”将允许字符串比较工作。另请注意,SQLA 中有DateTimeDate 格式

标签: python flask sqlalchemy


【解决方案1】:

您的示例未使用 SQLAlchemy 附带的 DateDateTime 列数据类型。您依赖于字符串的字典顺序,但要使其正常工作,日期/时间戳需要按照 ISO 8601 的行进行存储,例如YYYY-MM-DD.

要么更改您正在使用的字符串格式,要么选择适当的列类型,而不仅仅是String

【讨论】:

  • 好吧,所以我将格式更改为 ISO 8601,现在当我查询同样的内容时,数据库仍然给我错误的输出,有什么线索吗?
  • 你是如何迁移数据库中已有数据的格式的?
  • 为了测试目的,我创建了一个只有 4 条记录的新数据库。日期依次为2019-10-15、2019-10-16、2019-09-15、2019-09-20,last_30_days查询结果为[Records('1', '2019-10-15', 'picture', 'dasdas'), Records('2', '2019-10-16', 'picture', 'dasdasgas')]
  • 好的,今天是 10 月 21 日,那么结果有什么问题?九月的值都不是在过去 30 天内....
  • 哦,我知道这听起来很傻,但我是 20 岁。没关系,感谢战利品伙伴!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2017-05-25
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多