【问题标题】:importing updated files into a database将更新的文件导入数据库
【发布时间】:2012-08-19 11:25:56
【问题描述】:

我的文件每 2 小时更新一次。我必须自动检测文件并将从中提取的信息插入数据库。

我们的 DBMS 是 Postgresql,编程语言是 Python。你会建议我怎么做?

我想利用 DAL(数据库抽象层)在文件和数据库之间建立连接,并使用 postgresql LISTEN/NOTIFY 技术来检测新文件。如果你同意我的观点,请告诉我如何使用LISTEN/NOTIFY 函数来检测文件。

谢谢

【问题讨论】:

标签: postgresql streaming data-access-layer notify listen


【解决方案1】:

您需要编写一个作为守护程序保持运行的脚本,使用文件系统通知 API 在文件更改时运行回调函数。当通知脚本文件更改时,它应该连接到 PostgreSQL 并执行所需的工作,然后返回睡眠状态等待下一次更改。

查看目录更改的唯一真正跨平台方法是使用延迟循环轮询os.listdiros.stat 来检查新文件和更新的修改时间。这是对电源和磁盘 I/O 的浪费;对于大量文件,它也会变慢。如果您的操作系统在目录中的文件更改时可靠地更改目录修改时间,您可以在延迟循环中 os.stat 目录,这会有所帮助。

最好使用操作系统特定的通知 API。如果您使用 Java,我会告诉您使用 NIO2 watch service,它为您处理所有平台细节。看起来Watchdog 可能会为 Python 提供类似的东西,但我不需要在我的 Python 编码中进行目录更改通知,所以我没有对其进行测试。如果它不起作用,您可以使用特定于平台的技术,例如 Linux 的 inotify/dnotify,以及 Windows 的各种观察程序 API。

另见:

【讨论】:

  • 谢谢克雷格。这是非常有用的。如果我选择使用特定于平台的技术,我可以将它们合并到 python 环境中还是应该使用操作系统的命令行?
  • @user1043898 你还没有说你正在使用什么操作系统,这让你很难回答。 请使用您的操作系统更新您的问题。您绝对可以使用 Python 中特定于平台的目录监视工具,但如果它们仅作为 C API 直接可用,则可能需要一些跳跃。快速的谷歌搜索发现了一个用于 Python 的 inotify 模块,而对于 Windows,显然有 timgolden.me.uk/python/win32_how_do_i/…
  • 我的操作系统目前是 windows,但如果有必要我可以切换到 Linux。
  • @user1043898 看起来有一些很好的信息 - 对于任何一个平台,碰巧 - 在this question。在这和我已经给你的链接之间,我希望你能够解决它。
【解决方案2】:

您不能使用 LISTEN/NOTIFY,因为它只能从数据库中发送消息,而您的文件显然不在其中。

您需要让您的 python 脚本扫描文件所在的目录并检查它们的修改时间 (mtime)。如果它们被更新,您需要读入文件,解析数据并将其插入数据库。在不知道文件格式的情况下,没有办法更具体。

【讨论】:

  • 谢谢理查德。我实际上知道文件格式,并且知道如何将其转换为简单的文本文件。问题是检测新更新的文件。是否可以将 psycopg 或数据库抽象层 (DAL) 作为 Python 的数据库连接器?
  • 无论您如何连接到 PostgreSQL,这都不会告诉您有关无关文件的任何信息。可能有一个库可以为您执行此操作,否则只需扫描目录中的文件并检查时间戳。睡 60 秒,然后重复……
  • 谢谢。你知道如何扫描新文件吗?
  • 任何 Python 入门指南都应该涵盖这类内容。如果您还不知道一个好的指南无论如何都会证明是有用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多