python - 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)
有谁知道,或者有一个通常如何管理的例子?
解决方案
如果您有 .env 文件,请尝试以下操作
app.config['SQLALCHEMY_DATABASE_URI'] = environ.get('DATABASE_URL')
或以下配置文件
app.config.from_pyfile('config.cfg')
推荐阅读
- python - 什么是`sha256`,我应该把它的值放在anaconda包的`meta.yaml`文件中
- python - 我怎样才能让程序更干净一点?
- c# - 挂载 NTFS 符号链接时是否可以运行 Docker 映像?
- git - 如何将我的 GitHub 提交恢复到上一个?
- gitlab - gitlab CI/CD yml中的数组变量
- sql - Oracle SQL查询比较具有相同标识符的多行
- python - 调用对象类的方法时出现attributeError
- react-native - 使用 react-native-progress-steps 更改进度步骤指示器的边框宽度
- php - 区分联合中的两个表
- python - 有谁知道如何编写代码以使用您的网络摄像头获取框架?