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

问题描述 投票:1回答:2

据我所知,sqlalchemy让你设置任何与连接网址有关的唯一一次就是你打电话给create_engine

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

我不是在寻找如何捕捉凭证到期的情况(这似乎是直截了当的)。我想要的是一种替换用于新连接的连接字符串(特别是用户名和密码)的方法。

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

是否有一个人们使用的模式/食谱,我似乎无法找到?

sqlalchemy hashicorp-vault
2个回答
3
投票

我想我已经找到了我所忽略的东西:在creator的调用中有一个create_engine回调可以让你绝对控制所创建的连接。您丢失了对底层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)

-1
投票

sqlalchemy_mate可以缓解你的生活:

from sqlalchemy_mate import EngineCreator

ec = EngineCreator.from_json(
    json_file="path-to-json-file",
    json_path="credentials.db1", # dot notation json path
)
engine = ec.create_postgresql_psycopg2()

你的凭证

{
    "identifier1": {
        "host": "example.com",
        "port": 1234,
        "database": "test",
        "username": "admin",
        "password": "admin",
    },
    "identifier2": {
        ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.