Estoy probando tinydb con FastAPI, pero me quedé atascado con las fechas. ¿Hay una función para encontrar objetos entre dos fechas en TinyDB? No pude encontrar ninguno como $gt de Pymongo, etc. Intenté algo como esto pero no lo hice funcionó.
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)Creé un middleware para él a partir de la serialización de tinydb, pero cuando busco así
@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"))) Además, este patrón arroja otra excepción tinydb:Empty query was evaluated
Resumen rápido :
key:valuedatetime.datetime(2010, 1, 1, 12, 0)}Si guarda sus fechas en TinyDB como tiempo desde la época usando:
import datetime datetime.datetime(year=2022, month=1, day=15).timestamp() # 1642204800.0Puede consultar fácilmente sus fechas ya que solo está consultando flotadores
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}]La consulta de búsqueda se puede acortar a:
datetime.datetime( year=2022, month=1, day=4 ).timestamp() < q.date < datetime.datetime( year=2022, month=1, day=10 ).timestamp()