Flask 和 SQLAlchemy - 如何从配置文件中获取连接字符串?

时间:2021-06-04 13:40:41

标签: python flask sqlalchemy

我正在创建一个 Flask 项目并且正在努力设置。

我想使用 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 尚不可用。我现在的解决方案是首先将数据库连接字符串放在一个 env 变量中(见下文)。但这是一个有点hacky的解决方法。我更愿意在 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)

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

1 个答案:

答案 0 :(得分:0)

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

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

或者下面的配置文件

app.config.from_pyfile('config.cfg')
相关问题