【发布时间】: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