python - 服务器运行时重新创建 SQLAlchemy 对象是否安全?

标签 python flask thread-safety flask-sqlalchemy gunicorn

我们的应用程序使用flask + Gunicorn。现在我们希望让它能够在运行时重新加载数据库配置,这意味着它可以切换到新的数据库而无需重新启动进程。在配置中心的帮助下,我们可以在运行时调度配置,但是如何重新初始化全局变量数据库?

db = SQLAlchemy()
def create_app():
    app = Flask(__name__)
    app.config.from_object(dynamic_config)
    db.init_app(app)

并假设在某个时候。我们发送新的配置,如何使用新的配置来初始化数据库?或者用新的 SQLAlchemy() 实例替换它是否安全?就像这样做:

from models import set_db # which will set global db to new instance
from app import app
def callback(odl, new):  
    new_db = SQLAlchemy()
    # re-construct config with old, and new
    # now app.config is updated
    new_db.init_app(app)
    set_db(new_db)

这样做可以吗?我担心,这会导致线程安全之类的问题,并可能破坏 Transaction。

帮我解决这个问题,非常感谢

最佳答案

如果我是你,我会使用 SQLALCHEMY_BINDS配置或具有不同配置的数据库的不同实例,而不是每次都更改配置。 我认为使用应用程序更改数据库结构不是一个好习惯(如果您这样做)

关于python - 服务器运行时重新创建 SQLAlchemy 对象是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52574775/

相关文章:

python - 单击 PyQt 表项时更改属性

python - 将 Python 添加到 C++ : not finding Python. h

python - 如何从 Google App Engine 数据存储区查询中订购引用的对象?

python - bash 中的\'$char 是什么意思?

python - Flask request.get_json() 返回字符串而不是 json

python - 有没有办法配置 Python 日志记录来记录断言失败的内容或上下文?

docker - 如何在 Docker 容器(Python、Flask 和 Redis)中启动自定义 RQ 工作线程

c# - Random.Next 不是线程安全的并且在 .netcore 中返回 0

pthreads 程序的竞争条件会使操作系统或 X 完全崩溃吗?

java - Android Activity会关闭Looper&Handler吗?