【问题标题】:Importing a text file into SQL Server in Python在 Python 中将文本文件导入 SQL Server
【发布时间】:2010-11-22 11:12:41
【问题描述】:

我正在编写一个 python 脚本,它将对文本文件进行一些处理。作为该过程的一部分,我需要将制表符分隔文件的每一行导入到本地 MS SQL Server (2008) 表中。我正在使用 pyodbc,我知道该怎么做。但是,我有一个关于执行它的最佳方法的问题。

我将遍历文件,为文件的每一行创建一个 cursor.execute(myInsertSQL)。有没有人看到任何问题等待提交语句,直到所有记录都被循环(即在循环之后执行 commit() 而不是在每个单独执行之后的循环内)?我问的原因是某些文件将有超过 5000 行。我不知道尝试“保存它们”并一次性提交所有 5000 个是否会导致问题。

我对 python 还很陌生,所以我还不知道所有这些问题。

谢谢。

【问题讨论】:

  • “我不知道尝试“保存它们”并同时提交所有 5000 是否会导致问题。”你想象过什么样的“问题”?你试过了吗?它做了什么?将提交从循环中移到循环末尾是一个微不足道的更改,您可以轻松地同时完成这两项操作并包含您学到的内容。
  • 我已经尝试过使用较小的套装并且没有遇到问题。我担心的不是我在测试时它不起作用,而是如果有一些上限我应该注意。这些文件的大小会有所不同,可能会超过 5000。我正在编写的脚本将作为进入生产的计划批处理的一部分运行,我只是想确保我不会通过做一些不是推荐。
  • sqlserver的python接口是否提供.executemany方法?
  • 确实如此。谢谢。我忽略了这一点。 pyodbc 实现了它,我认为这可以很好地满足我的需求。 (code.google.com/p/pyodbc/wiki/Cursor)

标签: python database odbc commit bulkinsert


【解决方案1】:

如果我理解你在做什么,Python 就不会成为问题。在事务中执行语句不会在 Python 中创建累积状态。它只会在数据库服务器本身这样做。

提交时,您需要确保提交已发生,因为大批量提交可能会与数据库中的干预更改发生冲突。如果提交失败,您将不得不再次重新运行批处理。

这是我所知道的大批量和 Python/ODBC 的唯一问题(它甚至不是真正的 Python 问题,因为无论如何你都会遇到这个问题。)

现在,如果您在内存中创建所有 SQL,然后循环遍历内存表示,那可能更有意义。尽管如此,现代机器上的 5000 行文本确实没什么大不了的。如果您开始需要多处理两个数量级,您可能需要重新考虑您的流程。

【讨论】:

  • 感谢您的洞察力。我认为这个信息,结合上面的 executemany 想法将是我需要考虑的。
【解决方案2】:

创建一个文件并使用BULK INSERT。它会更快。

【讨论】:

  • 我之前没有使用过 BULK INSERT,但它非常值得研究。由于我明天必须完成这个脚本,所以我现在将采用第一种方法,并在有更多时间时重新访问 BULK INSERT。谢谢。
  • BULK INSERT 可能需要额外的数据库权限。我知道我必须向我们的系统管理员询问。
猜你喜欢
  • 2017-02-15
  • 2018-10-19
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2013-02-20
  • 2014-04-05
相关资源
最近更新 更多