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
的调用中没有定义 db
或 alias
,但我显然在我的 Mongo
对象中,即使那样是真的,我肯定无法从 db 集合中 检索 文档...
mongoengine 文档模型的元属性格式错误...
class Accounts(Document):
meta = {'db_alias': 'some_db',
'collection': 'things'}
解决方法: db_alias
需要改成db
。
我没有通过文档找到它,而且绝对没有通过极其无用的错误消息找到它。我只是一时兴起试了一下。现在一切都可以使用 FastAPI 框架。
我有 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
的调用中没有定义 db
或 alias
,但我显然在我的 Mongo
对象中,即使那样是真的,我肯定无法从 db 集合中 检索 文档...
mongoengine 文档模型的元属性格式错误...
class Accounts(Document):
meta = {'db_alias': 'some_db',
'collection': 'things'}
解决方法: db_alias
需要改成db
。
我没有通过文档找到它,而且绝对没有通过极其无用的错误消息找到它。我只是一时兴起试了一下。现在一切都可以使用 FastAPI 框架。