在两个日期之间查找TinyDB对象

3

我正在尝试在FastAPI中使用tinydb,但是在日期方面遇到了问题,TinyDB有没有类似于Pymongo的$gt等用于在两个日期之间查找对象的函数?我试过类似这样的东西,但是没有成功。

class DateTimeSerializer(Serializer):
    OBJ_CLASS = datetime  # The class this serializer handles

    def encode(self, obj):
        return obj.strftime('%Y-%m-%dT%H:%M:%S')

    def decode(self, s):
        return datetime.strptime(s, '%Y-%m-%dT%H:%M:%S')

serialization = SerializationMiddleware()
serialization.register_serializer(DateTimeSerializer(), 'TinyDate')

db = TinyDB("db.json", storage=serialization)

我创建了一个中间件,并使用 tinydb-serialization 进行了处理,但是当我像这样搜索时:
@app.get("/search")
async def date_get(date: Optional[str] = None,start_at: Optional[str] = None,
                end_at: Optional[str] = None, query: Query = Depends()):
    if start_at and end_at:
        date_db.search((query.date.strptime("%Y/%m/%d") > datetime.strptime(start_at, "%Y/%m/%d")) & (query.date.strptime("%Y/%m/%d") < datetime.strptime(end_at, "%Y/%m/%d")))

此模式还会抛出另一个异常tinydb:Empty query was evaluated

快速摘要:

  1. 我的数据直接来自爬虫(requests),所以我不想重写9-10个键:值
  2. 我不想将它们存储为日期时间对象,因为除了按日期搜索外,还将有不同的端点,因此我不想返回像这样的对象:datetime.datetime(2010, 1, 1, 12, 0)}
1个回答

0

如果您使用以下方式将日期保存在TinyDB中,即以自纪元以来的时间形式:

import datetime
datetime.datetime(year=2022, month=1, day=15).timestamp() # 1642204800.0

由于您只查询浮点数,因此可以轻松地查询您的日期

import datetime
from tinydb import TinyDB, Query

db = TinyDB('db.json')

db.insert_multiple([
  {
    'id': 1,
    'date': datetime.datetime( year=2022, month=1, day=5  ).timestamp()
  },
  {
    'id': 2,
    'date': datetime.datetime( year=2022, month=1, day=15 ).timestamp()
  }
])

q = Query()
print(db.search(
  (q.date < datetime.datetime( year=2022, month=1, day=10 ).timestamp())
  &
  (q.date > datetime.datetime( year=2022, month=1, day=4  ).timestamp())
))

# prints: [{'id': 1, 'date': 1641340800.0}]

搜索查询可以缩短为:

datetime.datetime( year=2022, month=1, day=4 ).timestamp() < q.date < datetime.datetime( year=2022, month=1, day=10 ).timestamp()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接