【问题标题】:Configuring sqlalchemy engine with user containing ":"使用包含“:”的用户配置 sqlalchemy 引擎
【发布时间】:2020-12-31 18:52:45
【问题描述】:

我正在尝试在 sqlalchemy 中配置一个引擎,以使用 get_cluster_credentials api 连接来自 AWS IAM 角色的临时凭证。 当我这样做时,这是我得到'IAM:user_rw'的用户。当我将引擎字符串配置为时出现问题

engine_string = "postgresql+pygresql://{user}:{password}@{endpoint}:{port}/{dbname}".format(
        user=cluster_creds['DbUser'],
        password=cluster_creds['DbPassword'],
        endpoint='big endpointstring',
        port=8192,
        dbname='small dbname')

我没有错误地创建引擎,但是在运行任何查询时我得到:致命:用户“IAM”的密码身份验证失败 测试用户并传入 DataGrip 它可以工作,所以很明显 sqlalchemy 正在让用户作为“IAM”而不是“IAM:user_rw”。

你知道如何强制 sqlalchemy 获取正确的用户吗?

【问题讨论】:

  • 只需在: 之前添加一个\ 就像这样IAM\:user_rw
  • 我正在尝试这个,所以我将user=cluster_creds['DbUser'] 更改为user="IAM\:user_rw,但现在引擎字符串显示为postgresql+pygresql://IAM\\:user_rw:etcetc。所以现在的错误是FATAL: password authentication failed for user "IAM\"。我怎样才能强制只解释一个\?
  • 您可以使用engine.URL.create为您构造连接URL/URI。

标签: python sqlalchemy amazon-redshift


【解决方案1】:

我设法使用 urllib parse_quote 以类似于 Gord 所指的方式解决了这个问题。最终代码

from urllib.parse import quote_plus
engine_string = "postgresql+pygresql://%s:%s@%s:%d/%s" % (
        quote_plus(user),
        quote_plus(passw),
        endpoint,
        port,
        dbname,
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 2010-10-03
    • 2015-03-09
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多