Postgresql 从 PHP 脚本中复制批量数据 - 理想情况下使用 ADODB

Posted

技术标签:

【中文标题】Postgresql 从 PHP 脚本中复制批量数据 - 理想情况下使用 ADODB【英文标题】:Postgresql COPY bulk data from within PHP script - ideally using ADODB 【发布时间】:2017-09-29 20:41:33 【问题描述】:

我有自定义软件,其中包含在 postgresql 服务器上的表之间复制数据的功能。它一次执行 1 行,当服务器靠近时这很好,但是当我开始部署延迟大于 300 毫秒的服务器时,这根本不能正常工作。

我相信解决方案是使用“COPY”语句,但我很难实现它。我正在使用ADODB php library

当我尝试从文件复制时,我收到错误“必须是超级用户才能复制到文件或从文件复制”。问题是我不知道如何复制“从标准输入”,其中标准输入实际上并未通过管道传输到 PHP 脚本。有什么方法可以使用 ADODB 将标准输入输入作为 sql 命令的一部分提供,还是有一个等效的命令可以让我在不等待每个单独插入的情况下进行批量插入?

【问题讨论】:

【参考方案1】:

Postgresql 扩展 dblink() 允许您将数据从一台服务器的数据库复制到另一台服务器。您需要知道服务器的 IP 地址和数据库正在运行的端口。以下是一些包含更多信息的链接:

http://www.leeladharan.com/postgresql-cross-database-queries-using-dblink

https://www.postgresql.org/docs/9.3/static/dblink.html

【讨论】:

【参考方案2】:

我通过使用插入命令解决了这个问题,该命令使用“union all”在单个语句中包含所有插入 - 即

$sql="INSERT INTO tablename (name,payload)
    select 'hello', 'world' union all
    select 'this', 'is a test' union all
    select 'and it', 'works'";
$q=$conn->Execute($sql);

此解决方案的一个限制是字符串需要被引用,而整数则不能。因此,我需要编写一些额外的代码来确保某些字段被引用而不是其他字段。

为了找出需要引用的列,我使用了

$coltypes=$todb->GetAll("select column_name,data_type 
                        from information_schema.columns 
                        where table_name='".$totable."'");

【讨论】:

***.com/questions/36476192/… @nathanhayfield - 感谢您提供链接,但该解决方案不能解决我的问题 - 它用于在同一台服务器上复制数据库。我的问题是在服务器之间和从 Postgres 内部复制。

以上是关于Postgresql 从 PHP 脚本中复制批量数据 - 理想情况下使用 ADODB的主要内容,如果未能解决你的问题,请参考以下文章

脚本任务从 Excel 批量复制到 Sql Server 2008。标题后缺少第一行

批量地理定位数百万个 IP

PostgreSQL:需要在从文件复制或从标准输入复制之间进行选择

20181219-PostgreSQL 流复制监控脚本

从 CLI 脚本中批量删除 IAM 角色

是否可以批量操作文件名? [复制]