如何在一段时间后更改 Flask-SQLAlchemy URI?
How can I change the Flask-SQLAlchemy URI after a certain period of time?
我正在使用 Flask-SQLAlchemy 连接到 AWS RDS 上的 Postgres 数据库。连接数据库的密码每15分钟过期一次,之后我需要为新的数据库连接生成一个新密码(打开连接就可以)。
我不知道如何配置 Flask-SQLAlchemy 以使用函数生成 SQLALCHEMY_DATABASE_URI
配置参数。围绕这一点的所有文档和讨论都指向在启动时使用静态值集。
我知道如何使用带有范围会话等的常规 SQLAlchemy 来做到这一点。但我真的希望使用 Flask-SQLALchemy 来解决这个问题。
为了完整起见,我使用@DanilaGanchar 建议的 custom connection function 完成了这项工作。
要在 Flask-SQLAlchemy 中配置它,您需要使用 v2.4.0 或更高版本(顺便说一下,这只是 released the day before I asked this question). That version has a SQLALCHEMY_ENGINE_OPTIONS
配置,它允许为 SQLAlchemy 的 create_engine
函数传入一个 kwargs 字典.
一个重要的注意事项是 Flask-SQLAlchemy 仍然期望 SQLALCHEMY_DATABASE_URI
的值,即使您的 creator
函数正在处理创建连接。
所以完整的解决方案看起来像
# config.py
def _get_conection():
# Get all your connection information
return psycopg2.connect(host=host, port=5432, password=password, ...
SQLALCHEMY_DATABASE_URI = "postgresql+pyscopg2://"
SQLALCHEMY_ENGINE_OPTIONS = {"creator": _get_connection}
# More settings etc.
# app.py
from app import config
from app.db import db
def create_app():
app = Flask(__name__)
app.config_from_object(config)
db.init_app(app)
return app
我正在使用 Flask-SQLAlchemy 连接到 AWS RDS 上的 Postgres 数据库。连接数据库的密码每15分钟过期一次,之后我需要为新的数据库连接生成一个新密码(打开连接就可以)。
我不知道如何配置 Flask-SQLAlchemy 以使用函数生成 SQLALCHEMY_DATABASE_URI
配置参数。围绕这一点的所有文档和讨论都指向在启动时使用静态值集。
我知道如何使用带有范围会话等的常规 SQLAlchemy 来做到这一点。但我真的希望使用 Flask-SQLALchemy 来解决这个问题。
为了完整起见,我使用@DanilaGanchar 建议的 custom connection function 完成了这项工作。
要在 Flask-SQLAlchemy 中配置它,您需要使用 v2.4.0 或更高版本(顺便说一下,这只是 released the day before I asked this question). That version has a SQLALCHEMY_ENGINE_OPTIONS
配置,它允许为 SQLAlchemy 的 create_engine
函数传入一个 kwargs 字典.
一个重要的注意事项是 Flask-SQLAlchemy 仍然期望 SQLALCHEMY_DATABASE_URI
的值,即使您的 creator
函数正在处理创建连接。
所以完整的解决方案看起来像
# config.py
def _get_conection():
# Get all your connection information
return psycopg2.connect(host=host, port=5432, password=password, ...
SQLALCHEMY_DATABASE_URI = "postgresql+pyscopg2://"
SQLALCHEMY_ENGINE_OPTIONS = {"creator": _get_connection}
# More settings etc.
# app.py
from app import config
from app.db import db
def create_app():
app = Flask(__name__)
app.config_from_object(config)
db.init_app(app)
return app