首页 > 解决方案 > Flask 和 SQLAlchemy - 如何从配置文件中获取连接字符串?

问题描述

我正在创建一个烧瓶项目并在设置中苦苦挣扎。

我想使用 SQLAlchemy 进行数据库访问。此处描述了该过程: https ://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/

如您所见,在此示例中,连接字符串是硬编码的(在我发现的大多数设置 SQLAlchemy 的示例中都是这种情况)。当然,在现实生活中的应用程序中,我想SQLALCHEMY_DATABASE_URI在一个config.py(或者在我的情况下,在一个.env文件中,但这无关紧要)。

然后出现的问题是在我application\__init__.py的 db_session 中需要导入,而在 db_session 内部需要连接字符串。那时,该应用程序尚不可用,因此 app.config 不可用:

from application.database import db_session
from application.main import main_bp


def init_app():

    """Initialize the core application."""
    app = Flask(__name__, instance_relative_config=False)
    app.config.from_object('config.Config')

    @app.teardown_appcontext
    def shutdown_session(exception=None):
        db_session.remove()

    with app.app_context():

        # Register Blueprints
        app.register_blueprint(main_bp)

但是目前 db_session 被导入,应用程序上下文app.config还不可用。我现在的解决方案是首先将数据库连接字符串放在一个环境变量中(见下文)。但这有点棘手。我宁愿把它放在 app.config 中。

import os
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker, declarative_base

connection_string = os.environ.get('SQLALCHEMY_DATABASE_URI')  

engine = create_engine(connection_string, connect_args={"check_same_thread": False})
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()


def init_db():
    import models
    Base.metadata.create_all(bind=engine)

有谁知道,或者有一个通常如何管理的例子?

标签: pythonflasksqlalchemy

解决方案


如果您有 .env 文件,请尝试以下操作

app.config['SQLALCHEMY_DATABASE_URI'] = environ.get('DATABASE_URL')

或以下配置文件

app.config.from_pyfile('config.cfg')

推荐阅读