【问题标题】:How to include SQLAlchemy Data types in Python dictionary如何在 Python 字典中包含 SQLAlchemy 数据类型
【发布时间】:2021-04-26 21:26:38
【问题描述】:

我使用 Python 3.6、pandas 和 sqlalchemy 编写了一个应用程序,以自动将数据批量加载到各种后端数据库中,并且脚本运行良好。

作为一个简短的总结,该脚本一次一个地从各种 excel 和 csv 源文件中读取数据到 pandas 数据帧,然后使用 df.to_sql() 方法将数据写入数据库。为了获得最大的灵活性,我使用 JSON 文件来提供所有配置信息,包括源文件的名称和类型、数据库引擎连接字符串、源文件的列标题和目标表中的列标题。

当我的脚本运行时,它会读取 JSON 配置,将指定的源数据导入数据框,重命名源列以匹配目标列,从数据框中删除任何不需要的列,然后将数据框内容写入数据库表使用类似的调用:

df.to_sql(strTablename, con=engine, if_exists="append", index=False, chunksize=5000, schema="dbo")

我遇到的问题是,我还想在 df.to_sql 方法中为列指定数据类型,并将它们作为 JSON 配置文件的输入提供,但是,这似乎不可能,因为所有字符串在 JSON 文件中需要用引号引起来,并且当我的代码读取它们时它们不会翻译。这就是 df.to_sql 调用的外观:

df.to_sql(strTablename, con=engine, if_exists="append", dtype=dictDatatypes, index=False, chunksize=5000, schema="dbo")

从我的 JSON 文件中形成 dtype 字典的条目如下所示:

"Data Types": {
                "EmployeeNumber": "sqlalchemy.types.NVARCHAR(length=255)",
                "Services": "sqlalchemy.types.INT()",
                "UploadActivities": "sqlalchemy.types.INT()",      
                 ......

还有更多,每列一个。

但是,当将上述内容作为字典读入时,我将其传递给 df.to_sql 方法,它不起作用,因为炼金术数据类型不应该用引号引起来,但是我无法解决这个问题在我的 JSON 文件中。因此,熊猫无法识别字典值。它们看起来像这样:

{'EmployeeNumber': 'sqlalchemy.types.INT()', ....}

他们真的需要看起来像这样:

{'EmployeeNumber': sqlalchemy.types.INT(), ....}

有没有人有这方面的经验来建议我如何能够在我的配置文件中拥有 sqlalchemy 数据类型?

【问题讨论】:

    标签: python-3.x pandas sqlalchemy


    【解决方案1】:

    您可以使用eval() 将字符串名称转换为该类型的对象:

    import sqlalchemy as sa
    
    dict_datatypes = {"EmployeeNumber": "sa.INT", "EmployeeName": "sa.String(50)"}
    pprint(dict_datatypes)
    """console output:
    {'EmployeeName': 'sa.String(50)', 'EmployeeNumber': 'sa.INT'}
    """
    for key in dict_datatypes:
        dict_datatypes[key] = eval(dict_datatypes[key])
    pprint(dict_datatypes)
    """console output:
    {'EmployeeName': String(length=50),
     'EmployeeNumber': <class 'sqlalchemy.sql.sqltypes.INTEGER'>}
    """
    

    请确保您不要将不受信任的输入值传递给eval()exec() 等函数。

    【讨论】:

    • 嘿,戈德。这绝对是一种享受!我什至不知道这个功能的存在,所以问题解决了,学习了很多!非常感谢。澄清一下,这个脚本在一个安全、可信的环境中运行,所以配置输入脚本事先是众所周知的,所以这个解决方案运行良好。
    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 2021-08-04
    • 2019-01-15
    • 1970-01-01
    • 2011-05-05
    • 2022-01-13
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多