【问题标题】:Flask-Mongoengine always connects to `test` databaseFlask-Mongoengine 总是连接到 `test` 数据库
【发布时间】:2020-09-21 09:20:27
【问题描述】:

我将烧瓶与烧瓶-mongoengine 一起使用。应用程序是通过应用程序工厂设置的,如here 所述。

我的模型在单独的文件中定义,如下:

from flask_mongoengine import MongoEngine
db = MongoEngine()

class NodeModel(db.Document):
    node_id = db.UUIDField(primary_key=True)
    ....

__init__.py 中的应用工厂如下所示:

def create_app():
    app = Flask(__name__, static_url_path=''
    ...
    app.config['MONGODB_DB'] = 'myDb'
    app.config['MONGODB_HOST'] = ....
    app.config['MONGODB_UUIDREPRESENTATION'] = 'standard'

    with app.app_context():
        from models import db
        db.init_app(app)
        ...
    
    return app

应用程序正确启动,所有路由都正常工作。但是,数据存储在默认的test 数据库中,而不是myDb。其他 MongoDB 配置,如主机和 MONGODB_UUIDREPRESENTATION 受到尊重。我一直在研究这个问题几个小时,但无济于事。我错过了什么?如何设置 flask-mongoengine 以连接正确的数据库?

【问题讨论】:

    标签: flask mongoengine flask-mongoengine


    【解决方案1】:

    如果您通过app.config['MONGODB_SETTINGS'] 进行操作有帮助吗? 例如

    app.config['MONGODB_SETTINGS'] = {
        'db': 'myDb',
        'host': os.getenv('MONGODB_HOST', 'localhost:27017'),
    }
    

    另外,请注意来自 uri 的数据库名称优先于名称。所以如果你使用

    app.config['MONGODB_SETTINGS'] = {
        'db': 'myDb',
        'host': 'mongodb://localhost/',
        ...
    }
    

    mongoengine 将写入test db,因为主机中没有设置。

    顺便说一句,我认为 mongoengine 并不总是在 URI 中获取数据库名称,因为当我最近使用它时

    app.config['MONGODB_SETTINGS'] = {
        'host': 'mongodb://localhost/myDb',
        ...
    }
    

    mongoengine 也不断写信给test

    【讨论】:

    • 我不知道主机字符串会覆盖显式数据库设置。感谢您的提示!
    【解决方案2】:

    我也遇到过同样的问题。当你从 Azure 门户获取连接字符串时,它看起来像这样。

    export MONGODBCONNSTR="mongodb://<USERNAME>:<PASSWORD>@<HOST>:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@cpe-self-service-db@"  
    

    将我的数据库名称“MYDB”添加到 URI 中的此连接,如下所示。

    export MONGODBCONNSTR="mongodb://<USERNAME>:<PASSWORD>@<HOST>:10255/MYDB?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@cpe-self-service-db@" 
    

    然后我有更新来自

     app.config['MONGODB_SETTINGS'] = {
        'host': f'{os.environ.get("MONGODBCONNSTR")}/MYDB'
    }
    

    app.config['MONGODB_SETTINGS'] = {  
            'host': f'{os.environ.get("MONGODBCONNSTR")}'  
        }  
    

    app.config['MONGODB_HOST'] = f'{os.environ.get("MONGODBCONNSTR")}'
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2021-11-02
      • 2018-02-09
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      相关资源
      最近更新 更多