Tengo una aplicación FastAPI Python con rutas que operan en una instancia de MongoDB. La conexión funciona bien y puedo consultar documentos para mis extremos GET, pero parece imposible crear un nuevo documento desde FastAPI.
Constantemente obtengo:
No ha definido una conexión predeterminada
Tengo una secuencia de comandos independiente que maneja algunas tareas de migración de datos y usa exactamente la misma clase de base de datos y modelos de documentos que la aplicación FastAPI, y esa secuencia de comandos puede guardar documentos en mongo perfectamente bien. No hay diferencia en cómo se crea una instancia del objeto DB entre la API y el script.
La clase de base de datos:
from os import getenv from mongoengine import connect from pymongo import MongoClient from pymongo.errors import ServerSelectionTimeoutError class Mongo: @property def target_db(self): return 'some_db' @property def uri(self) -> str: env_uri = getenv('MONGODB', None) if env_uri is None: raise DBError('MONGODB environment variable missing') return env_uri.strip() def connect(self) -> MongoClient: try: return connect(host=self.uri, db=self.target_db, alias=self.target_db) except ServerSelectionTimeoutError as e: raise ServerSelectionTimeoutError(e)Todos mis modelos de base de datos tienen metaatributos que definen exactamente qué base de datos y colección usar:
class Thing(Document): meta = {'db_alias': 'some_db', 'collection': 'things'}Las consultas sobre documentos existentes tienen éxito dentro de una definición de ruta:
results = Thing.objects.filter(**query) # This returns things that I can iterate overLa creación de documentos falla dentro de una definición de ruta:
new_thing = Thing(**creation_args) new_thing.save()Error:
mongoengine.connection.ConnectionFailure: You have not defined a default connection¿Y eso que significa? Sé que estoy conectado porque puedo consultar la base de datos.
¿Cómo es posible que pueda consultar con éxito documentos de Mongo pero no guardarlos? Todas las sugerencias que he visto en línea apuntan a no haber definido una base de mongoengine.connect o un alias en la llamada a db , pero claramente estoy en mi objeto Mongo , e incluso si eso fuera cierto, seguramente no sería capaz de recuperar documentos de la colección de db...
Los modelos de documentos mongoengine tenían meta atributos con formato incorrecto...
class Accounts(Document): meta = {'db_alias': 'some_db', 'collection': 'things'} Solución: era necesario cambiar db_alias a db .
No encontré esto a través de la documentación, y definitivamente no a través de los mensajes de error extremadamente inútiles. Lo probé por capricho. Ahora todo funciona usando el marco FastAPI.