有没有办法更新 sqlalchemy 引擎上的连接凭据?

Is there a way to update connection credentials on a sqlalchemy engine?

据我所知,sqlalchemy 唯一一次允许您设置与连接有关的任何内容 url 是在您调用 create_engine.

我正在使用 vault's database secret engine 来管理数据库上的短期凭据,这意味着我的应用程序应该足够健壮以在任何给定时间处理凭据失效。

我不是在寻找如何捕捉凭据过期的情况(这看起来很简单)。我想要的是一种 替换 用于新连接的连接字符串(特别是用户名和密码)的方法。

我考虑过的一个选择是销毁引擎并重新创建一个新引擎,但是根据 dispose 的文档,如果检查了任何连接,这似乎可能会导致内存泄漏...

是否有 pattern/recipe 人使用这个我似乎找不到?

我想我发现了我忽略的问题:在对 create_engine 的调用中有一个 creator 回调可用,它使您可以完全控制所创建的连接。您失去了对底层 dbapi/dialect 的 ORM 抽象,但它允许您随心所欲地更改连接。

所以我的实现看起来像这样:

import sqlalchemy
import cx_Oracle

def get_new_connection(self):
    username, password = get_new_creds_from_vault()
    return cx_Oracle.connect(user=username, password=password, dsn='details...')

engine = sqlalchemy.create_engine('oracle://', creator=get_new_connection)