Python 如何在sqlalchemy+;psycopg2?

Python 如何在sqlalchemy+;psycopg2?,python,postgresql,amazon-web-services,sqlalchemy,amazon-aurora,Python,Postgresql,Amazon Web Services,Sqlalchemy,Amazon Aurora,我继承了一些使用sqlalchemy和psycopg2的代码,这些代码需要在AWS上运行。RDS Postgres支持基于iam的身份验证,但其实现方式相当困难:您使用AWS RDS API请求临时密码,该密码有效期约为15分钟,然后将其作为密码传递 我的代码有效地执行了e=create\u引擎(make\u sqlalchemy\u string()),其中make\u sqlalchemy\u string()进行aws api调用,获取临时密码,暂时一切正常。除此之外,sqlalchemy

我继承了一些使用sqlalchemy和psycopg2的代码,这些代码需要在AWS上运行。RDS Postgres支持基于iam的身份验证,但其实现方式相当困难:您使用AWS RDS API请求临时密码,该密码有效期约为15分钟,然后将其作为密码传递

我的代码有效地执行了
e=create\u引擎(make\u sqlalchemy\u string())
,其中
make\u sqlalchemy\u string()
进行aws api调用,获取临时密码,暂时一切正常。除此之外,sqlalchemy代码中的某个地方关闭了连接,然后密码不再有效。是否已经有一种方法可以使sqlalchemy请求在每次需要重新连接时都有一个新的连接字符串

我可以想出一些变通办法,但没有一个是令人愉快的。是否有一个标准的方法来实现这一点


谢谢

一种方法是使用
creator
参数:

creator–返回DBAPI连接的可调用函数。此创建函数将传递给基础连接池,并用于创建所有新的数据库连接。使用此函数会导致绕过URL参数中指定的连接参数

只需修改您的
make\u sqlalchemy\u string()
即可生成的
dsn
参数,这可能意味着由于已接受,根本不必修改它,并传递创建者:

create_engine('postgresql://', creator=lambda: psycopg2.connect(make_dsn_string()))

这当然奏效了。谢谢它需要数据库url的协议标识符部分,不过:
engine=create_engine('postgresql+psycopg2://',creator=db.connect)
(其中
db
是一个单例类,我必须包装一些其他功能)好的方面,我将修复答案以反映这一点(因为psycopg2是默认值,我想可以省略)。