【问题标题】:Is it possible to pass a dictionary into create_engine function in SQLAlchemy?是否可以将字典传递给 SQLAlchemy 中的 create_engine 函数?
【发布时间】:2019-04-28 23:36:54
【问题描述】:

我正在尝试启动与 Azure SQL 数据库的连接。出于安全原因,我不能硬编码用户名和密码,我需要从配置文件中的字典中获取它并以这种方式将其放入连接 URL。

当我尝试这样做并在 Jupyter 笔记本中运行它时,{key[value]} 并没有被它在配置文件中引用的内容替换。

如果我使用格式化字符串,我会得到KeyError。如果我不使用格式化字符串,它只会按字面意思打印{variablename}

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您不能将字典直接传递到 create_engine() 以代替 url,但是您可以传递 sqlalchemy.engine.url.URL 对象,该对象可以使用 dict 轻松实例化。

    来自the docs

    这个对象适合直接传递给 create_engine() 打电话。

    例如:

    from sqlalchemy.engine.url import URL
    
    config = dict(
        drivername='driver',
        username='username',
        password='qwerty1',
        host='127.0.0.1',
        port='5000',
        database='mydb',
        query={'encoding': 'utf-8'}
    )
    
    url = URL.create(**config)
    
    print(url)  # driver://username:qwerty1@127.0.0.1:5000/mydb?encoding=utf-8
    
    engine = create_engine(url, echo=True)
    

    但是,您在传递字符串格式的 URL 时遇到的问题不太可能是 SQLAlchemy 问题,因为字符串格式会在 create_engine() 得到字符串之前发生。不幸的是,您的问题没有包含重现您遇到的确切问题的示例,所以我不能说更多。

    【讨论】:

    • 该配置字典可以包含 SSL 凭据吗?
    • SSL 参数可以作为dict 直接传递到create_engine()。见:stackoverflow.com/a/14992181/6560549
    • 使用url = URL.create(**config) 来避免弃用错误
    • 我认为最后一行全大写的“URL”应该是小写的“url”。
    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多