【问题标题】:Create mongoengine connection wrapper to use in multiple modules创建 mongoengine 连接包装器以在多个模块中使用
【发布时间】:2019-01-15 10:42:50
【问题描述】:

我正在创建一个包装器来解决我与 mongoengine 的所有连接,因此我创建了一个从文件读取 mongoDB 配置并连接到它的函数。

函数如下所示:

def connect_mongo_odm(config_file_location, db_name):
    if db_name:
        base_path = ['databases', db_name]
        conf_specs = {
            'host': {
                'path': base_path + ['host']
            },
            'port': {
                'path': base_path + ['port']
        }
    }

    fileConfiguration = dao_utils.readConfiguration(config_file_location, conf_specs)

    auth = None
    host = fileConfiguration.get('host', None)

    host = "mongodb://" + host

    connect(alias=db_name,
            host=host,
            socketKeepAlive=True, socketTimeoutMS=30000)

我把它用作:

# import previous function
# This is another module in my application
connect_mongo_odm('/path/to/config/file', 'dbName')

但是当我尝试保存文档时,我收到一个异常,说我没有定义默认连接。

【问题讨论】:

  • 您的文档定义是否有一个 meta 属性来指定它们应该使用的连接别名,例如meta = {'db_alias': 'dbName'}?您在connect_mongo_odm 中为您的连接指定一个不是'default' 的别名。如果您的文档没有该元属性,他们将尝试使用别名为 'default' 的连接,这显然不是在您的情况下创建的。
  • 不,文档没有 'db_alias' 属性,但我尝试设置 meta = {'db_alias': db_name} 仍然无法正常工作。 @shmee
  • 您是否仍然遇到同样的错误?而且您似乎使用db_name 作为该meta 属性中的变量。在这种情况下,您何时何地设置它?
  • 在文档声明中,我添加了meta={'db_alias': dbName},但它不起作用。 @shmee
  • 在你之前的评论中是db_name,现在你说是dbName。两者哪一个是真的?除此之外,您使用它们时不带引号,这使它们成为变量,而不是我在示例中使用的字符串。最后,重要的是赋予连接的别名和赋予元的 db_alias 键的值具有相同的值。此外,它不起作用 没有帮助。请分享确切的错误及其发生位置。

标签: python mongoengine


【解决方案1】:

您需要在每个 Document 类中定义meta = {"db_alias": "your_connection_alias"}。如果不设置,它将使用“默认”别名。

查看示例:https://stackoverflow.com/a/56434241/6203472

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2014-04-04
    • 2018-05-30
    相关资源
    最近更新 更多