无法在 ETL 过程中使用 Pandas 和 SQLAlchemy 将列名从 CSV 更改为 SQL Server DB

Posted

技术标签:

【中文标题】无法在 ETL 过程中使用 Pandas 和 SQLAlchemy 将列名从 CSV 更改为 SQL Server DB【英文标题】:Not able to change column names using Pandas and SQLAlchemy in an ETL process from CSV to a SQL Server DB 【发布时间】:2020-03-12 22:47:56 【问题描述】:

我正在使用 engine.execute() 运行原始 SQL 来更改 SQL Server 中的列名,如下所示:

engine.execute('exec sp_rename 'table_name."Old Column Name"', 'NewColumnName', 'COLUMN'')

我没有收到任何错误,日志显示我正在尝试执行的行,但更改未反映在表中。

查看日志:

2020-03-16 09:33:15,671 INFO sqlalchemy.engine.base.Engine exec sp_rename 'table_name."Old Column Name"', 'NewColumnName', 'COLUMN'
2020-03-16 09:33:15,671 INFO sqlalchemy.engine.base.Engine ()
2020-03-16 09:33:15,769 INFO sqlalchemy.engine.base.Engine ALTER TABLE table_name ALTER COLUMN [Column Name] date
2020-03-16 09:33:15,769 INFO sqlalchemy.engine.base.Engine ()
2020-03-16 09:33:15,773 INFO sqlalchemy.engine.base.Engine COMMIT

它显示了我正在尝试重命名列的位置,但它没有提交。之后,它显示我在哪里更改列数据类型并显示它已提交。如果我将尝试执行的行从日志复制到 DataGrip 控制台并运行它,则名称更改成功。

注意:CSV 中的所有列名都有空格,而且很多都有特殊字符。用括号括起来的列名已经解决了我执行原始 SQL 的其他地方的问题。我已经在 DataGrip 控制台中尝试了括号和双引号,所以我认为在这种情况下这不是问题。不过我肯定是错的。

感谢任何帮助。

python 2.7

熊猫 0.20.3

sqlalchemy 1.3.13

【问题讨论】:

欢迎来到 SO。那里缺少引号吗? 谢谢!我期待着更多的参与。您认为我可能在哪里缺少引号? 嗨@DarkMarcos,无论您为整个字符串选择什么引号,都需要用\转义相应的内部(双)引号。如果你使用 ' 你需要用 \' 转义内部;与“-> \”相同。我想知道这是否是一个错字,或者您的代码中有这样的错误。这可能是造成问题的原因。 @Ictus,我正在转义内部引号。我没有在此处的代码中包含它以使其更具可读性。 【参考方案1】:

因此,在解决此问题近一周后,我找到了解决方案。不知道为什么,但使用 engine.execute() 和 sp_rename 并没有提交事务。我必须通过创建会话并显式提交来提交事务。它看起来像这样:

engine = create_engine('your_db_url')
Session = sessionmaker(bind=engine)

session = Session()
session.execute('exec sp_rename 'table_name."Old Column Name"', 'NewColumnName', 'COLUMN'')
session.commit()

【讨论】:

以上是关于无法在 ETL 过程中使用 Pandas 和 SQLAlchemy 将列名从 CSV 更改为 SQL Server DB的主要内容,如果未能解决你的问题,请参考以下文章

原创BI解决方案选型之ETL数据整合工具对比

ETL批量任务调度平台TASKCTL监控中常见问题

Spark 与 Scala 中的 ETL 过程

ETL - 自动从一个数据库到另一个数据库的数据传输

某大型银行电子渠道报表系统SSIS ETL优化报告

解答如何保障ETL过程的数据正确性。这个过程会产生哪些问题?