gpt4 book ai didi

python - Flask SQLAlchemy 设置动态 URI

转载 作者:太空狗 更新时间:2023-10-30 03:04:44 24 4
gpt4 key购买 nike

我在 WSGI 下提供了一个 Flask 应用程序,其中数据库 URI 随时间变化。每两个小时,URI 就会切换到另一个数据库。我用这段时间来填充一个数据库,而另一个则为应用程序提供数据。

我很难弄清楚如何最好地配置 session ,以便在发生切换时,客户端将在他们的下一个请求中获得正确的(不同的)数据库。根据我的测试,如果我在顶层初始化数据库,当切换发生时,客户端仍然指向旧数据库。

我考虑过在页面(索引等)本身内部设置 session ,但这很痛苦,然后我担心打开和关闭太多数据库连接并让它们闲置。我想我可以通过在启动时初始化两个 session ,然后只选择在每个页面内切换时使用哪个 session 来使其工作。这似乎效率低下,我相信有更好的方法。

帮助?!

~~~~~~~~~

这是我目前正在做的事情的大致思路,但无法在请求之间更改 URI。顶层代码只运行一次,或者每隔一段时间运行一次。

if now.hour % 2:
db_name = 'db1'
else:
db_name = 'db2'

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://foo:poo@localhost:3306/%s" % db_name

def init_db(uri, **kwargs):
engine = create_engine(uri, **kwargs)

Base.metadata.create_all(bind=engine)

global db_session
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base.query = db_session.query_property()


init_db(app.config['SQLALCHEMY_DATABASE_URI'], pool_recycle=3600)

@app.teardown_request
def shutdown_session(exception=None):
db_session.remove()

@app.route('/')
def index():
...etc...

工作示例 - 漂亮。

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://foo:poo@localhost:3306/%s"

class SessionManager(object):
def __init__(self, base_uri=None, **kwargs):
self.session = None
self.base_uri = base_uri
self.kwargs = kwargs

def get_session(self):
if now.hour % 2:
db_name = 'db1'
else:
db_name = 'db2'

if self.session:
if self.session.name == db_name:
return self.session
else:
self.session.remove()
self.session = None

if not self.session:
engine = create_engine(self.base_uri % db_name, **self.kwargs)
db_session = scoped_session(sessionmaker(bind=engine))
db_session.name = db_name
self.session = db_session
return db_session

session_manager = SessionManager(base_uri=app.config['SQLALCHEMY_DATABASE_URI'], pool_recycle=3600)

db_session = LocalProxy(session_manager.get_session)

最佳答案

您可以为 session 创建一个自定义生成器,它将在您的规则规定时重新创建引擎和范围 session 。有点像

class SessionManager(object):

def __init__(self):
self.session = None

def get_session(self):
# return existing session or make a new engine and scoped_session

要使此类透明,请使用 Werkzeug's LocalProxy .使用 session 的代码根本不需要更改。

session_manager = SessionManager()
db_session = LocalProxy(session_manager.get_session)

关于python - Flask SQLAlchemy 设置动态 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14491678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com