【问题标题】:Which language to use for scripting PostgreSQL? [closed]使用哪种语言编写 PostgreSQL 脚本? [关闭]
【发布时间】:2011-01-11 04:50:37
【问题描述】:

我即将为一个客户开展一个 PostgreSQL 项目。他们想开发一个庞大的专业数据库,其中包含许多复杂的连接,所以经过考虑我选择了PostgreSQL over MySQL。

一个重要的考虑因素是如何使用脚本有效地与数据库交互。目前,客户使用大约一百万个脚本来导入和重塑数据以满足他们的需求,但不使用数据库(除非您将 CSV 文件视为数据库)。随着带有查询和视图的数据库结构的到来,对脚本的需求将会减少,但仍然需要经常进行导入,以及导出/报告。对我来说,理想的最终结果是一系列标准化的脚本,最好是带有 Web 界面的,这样客户只需单击按钮即可快速且无错误地执行常规任务。

我的问题是哪种脚本编写方法最合适。可能任何带有 Postgres 或 ODBC 插件的脚本语言就足够了,但从长远来看,我希望做出明智的选择。有人有这方面的经验吗? Postgres 是否提供内部脚本语言,是否容易为此构建 GUI?是否有任何可用于导入/导出的标准化工具,它们是否足够可定制以允许将任务标准化到点击级别? PHP 或 perl 怎么样?

提前致谢。任何提示、资源、困惑的表情或可怜的手势都将不胜感激;-)

【问题讨论】:

  • 他们有一个 Windows 服务器、IIS 和 SBS。我很想安装那个,因为它有大量内存和多个处理器,虽然我更喜欢专用的 Unix 机器。
  • 你懂什么语言?您的时间紧迫,还是有时间学习新语言?
  • 我只有 PHP 方面的经验,就脚本语言而言。我也知道 C,但对我来说这似乎不太实用。我的日程安排很充实,所以我可以学习新语言,只要学习曲线不太陡峭。我很想学习 perl,只要能够穿“perlmonger”衬衫和帽子;)

标签: sql database postgresql scripting import


【解决方案1】:

既然您谈论的是明确地只是操纵数据库的脚本,我将从最原生的工具开始。

  • 用于操作和处理数据的 SQL 和 PL/pgSQL 存储函数
  • COPY FROM 和 COPY TO 用于从平面文件导入和导出
  • 一种 ETL 工具,可用于上述无法处理的任何重塑

现在,您想提供一些简单的 Web 界面来与这些脚本进行交互。这里最好的语言可能是您或您的团队已经知道的语言。所有主要语言都有 Postgres 驱动程序。如果您将数据操作任务保留在数据库层,您选择的语言将几乎没有影响。

要考虑的一件事是执行典型脚本需要多长时间。如果超过几分钟,那么我建议将其与 Web 界面解耦。在这种情况下,Web 界面应允许用户将脚本排队以启动,以便服务器可以独立于 Web 请求周期运行它。

【讨论】:

  • 这是可靠的建议。谢谢你。在等待其他见解之前,我倾向于在 symphony 等框架中使用 PHP,使用 AJAX 来放置数据库调用。
  • 更新:我现在一直在使用 M$ SQL Server 而不是 Postgres,我发现内部 T-SQL 函数和 SSIS 包 (ETL) 比任何其他方法都快通过 ODBC 连接的脚本语言。我倾向于认为这对于 Postgres 来说是一样的。所以我建议任何人,从内部存储过程开始,然后看看其他脚本的可能性。
  • 小补充:您对网络界面的看法也是正确的。让 Web 界面调用本机存储过程比在 PHP/ASP/任何 Web 脚本本身中执行任何脚本或操作要快得多。
【解决方案2】:

我使用 Python/Jython 连接到 PostgreSQL 并做各种事情。

优点:

  • 有pl/python,所以你可以使用来自 PostgreSQL 的 Python
  • 你可以使用Python DB API创建“独立”程序,有doc关于数据库编程,PostgreSQL详细说明
  • 如果您喜欢 JVM 环境,尤其是 JDBC 驱动程序,可以使用 Jython

使用示例:

  • 将保存在 BLOB 中的 PDF、MS Word 和 OopenOffice 文档转换为文本以对其进行索引
  • 从各种来源导入数据,不仅是 cvs; Python 非常擅长转换文本数据
  • 在我们的一些应用程序是本机并使用 ODBC 或 JDBC 驱动程序时测试驱动程序,而 Jython 可以与这两种驱动程序一起使用(对于 ODBC,有 JDBC-ODBC 桥)

在我关于 SO 的其他帖子中,您可以看到我将 Python/Jython 与 Oracle 和 Informix 等其他数据库一起使用。例如,我创建了从数据库模式中转储一些信息的工具,以便我可以轻松地比较测试和生产环境中的数据库。

【讨论】:

  • 谢谢。我会考虑使用 Python 和 Perl。
【解决方案3】:

我使用 Perl。我也会建议的。就 postgres 提供的数据库脚本语言而言:pl/perl 比 pl/php 更发达,pl/perlu 将 CPAN 引入 Postgres。

你还有pl/sql(非常适合小东西)和pl/pgsql(也有它的应用程序)。

不幸的是,Postgres 对 CSV 的支持有点笨拙,我将很快开始一个 Perl 项目,但要解决这个问题(可能在下个月内)。目前,您几乎必须使用 pgloader (恕我直言)有一个笨拙的语法。 Perl 有Text::CSV_XS,这是处理 CSV 的天赐之物。

Perl 在数据库访问和使用方面历来比 PHP 好得多。我仍然相信这是领先于 PHP 的好方法。 PHP 仍然缺乏异步框架,并且仅限于 Web。 PHP 的优势往往更多地集中在语言的非技术特性上,即学习曲线和共享主机可移植性。

【讨论】:

  • 为什么选择 pgloader? “使用 CSV 从 复制 ”怎么样?我从 psql 和 Perl/DBD::Pg 都没有任何问题。
  • 谢谢。这对我来说都是非常有用的信息。也许是一个愚蠢的问题,但pl/perl 是一个成熟的 perl,我可以在其中使用Text::CSV_XS,还是我需要pl/perlu?
  • @matthew wood:在现实世界中,COPY *,因为目前实施是远远不够的,如果您想了解 COPY 的负面影响和问题,我是wiki.postgresql.org/wiki/COPY 的作者它。 @littlegreen:pl/perlu,只是意味着你可以拉入外部模块,它本身并没有什么特别之处,但是Text::CSV_XS 的使用并不是在数据库中编写脚本。由于 psql 中缺少原生 CSV 功能,我使用 Text::CSV_XS 将 CSV 转换为导入 psql。例如,我使用 pl/perlu 为电子邮件数据类型和 VIN 号码创建域。
  • 虽然我可以理解您从无法联系/控制/无论如何的来源收到 CSV 文件时的沮丧,但其中六个问题中有五个与 CSV 导入无关(NULL AS.. .) 或由于 CSV 文件格式不正确。唯一真正是 COPY 错误的不是强制使用区域设置格式的数据类型,但我宁愿不这样做,因为我必须与欧洲数据提供商交换并且我在美国(15.000 会默默地转换为我这边的 15如果您没有定义两个语言环境;最好拒绝并手动干预)。
  • 我不确定您是如何以这种方式进行划分的。所有这些问题都是由于导出不良造成的,这是处理 CSV 时的现实生活中的共同点。在 MSSQL 和 MySQL 中,所有这些问题都可以通过它们的 CSV 加载接口进行管理,但仅使用 \COPY 是无法管理的。我拒绝分担责任。 Pg 的许多问题都在上游得到承认,他们只是在等待具有足够专业知识的人提交可接受的补丁。在 8.1 之前,Pg 甚至无法处理带有标题的 CSV(丢弃第一行)。
【解决方案4】:

SchemaCrawler for PostgreSQL 允许您使用 JavaScript 针对数据库编写脚本。

【讨论】:

  • JavaScript,还有另一种可能性 :-) 这越来越有趣了。我会花一些时间研究所有选项,看看哪个最强大。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2013-03-24
  • 2018-07-17
  • 2013-06-19
  • 2011-03-05
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多