从我可以看出的那样,唯一的sqlalchemy让您与连接URL设置任何关系是在调用create_engine
时。
我正在使用Vault的数据库秘密引擎来管理数据库中的短期凭据,这意味着我的应用程序应该足够强大,可以在任何给定时间处理凭据无效。
我不是在寻找如何 catch 凭据到期的情况(这似乎是简单的(。我想要的是一种替换的连接字符串(特别是用于新连接的用户名和密码(的方法。
我考虑过的一种选项是破坏引擎并重新创建新的选项,但是根据处置的文档,如果有任何连接,这似乎会导致内存泄漏...
人们似乎找不到的模式/食谱我似乎找不到吗?
我想我已经找到了我所忽略的东西:create_engine
的调用中有一个可用的创建者回调,可为您提供对创建的连接的绝对控制。您将ORM抽象丢给了基础DBAPI/方言,但它使您可以随心所欲地更改连接。
所以我的实现看起来像这样:
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)