我正在创建一个 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)
有谁知道,或者有一个通常如何管理的例子?
答案 0 :(得分:0)
如果您有 .env 文件,请尝试以下操作
app.config['SQLALCHEMY_DATABASE_URI'] = environ.get('DATABASE_URL')
或者下面的配置文件
app.config.from_pyfile('config.cfg')