无法在 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的主要内容,如果未能解决你的问题,请参考以下文章