【问题标题】:Not able to change column names using Pandas and SQLAlchemy in an ETL process from CSV to a SQL Server DB无法在 ETL 过程中使用 Pandas 和 SQLAlchemy 将列名从 CSV 更改为 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,我正在转义内部引号。我没有在此处的代码中包含它以使其更具可读性。

标签: python sql-server sqlalchemy


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多