FastAPI 拒绝让我创建 mongoengine 文档

FastAPI refuses to let me create a mongoengine document

我有 FastAPI Python 应用程序,其路由在 Mongo 数据库实例上运行。 连接工作正常,我可以为我的 GET 端点查询文档,但是从 FastAPI 中创建 一个新文档似乎是不可能的。

我一直得到:

You have not defined a default connection

我有一个独立的脚本来处理一些数据迁移任务,它使用与 FastAPI 应用程序完全相同的数据库 class 和文档模型,并且该脚本能够保存文档mongo 完全没问题。 API 和脚本之间的 DB 对象实例化方式没有区别。

数据库class:

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)

我所有的数据库模型都有元属性定义要使用的数据库和集合:

class Thing(Document):
    meta = {'db_alias': 'some_db',
            'collection': 'things'}

在路由定义内对现有文档的查询成功:

results = Thing.objects.filter(**query)
# This returns things that I can iterate over

在路由定义内创建文档失败:

new_thing = Thing(**creation_args)
new_thing.save()

错误:

mongoengine.connection.ConnectionFailure: You have not defined a default connection

那是什么意思?我知道我已连接,因为我可以查询数据库。

我怎么能从Mongo成功查询文档但不保存它们? 我在网上看到的每条建议都指出在 mongoengine.connect 的调用中没有定义 dbalias,但我显然在我的 Mongo 对象中,即使那样是真的,我肯定无法从 db 集合中 检索 文档...

mongoengine 文档模型的元属性格式错误...

class Accounts(Document):
    meta = {'db_alias': 'some_db',
            'collection': 'things'}

解决方法: db_alias 需要改成​db

我没有通过文档找到它,而且绝对没有通过极其无用的错误消息找到它。我只是一时兴起试了一下。现在一切都可以使用 FastAPI 框架。