带有STDIN的COPY批量插入

时间:2019-07-28 08:19:00

标签: php laravel postgresql

嗨,我正在尝试从PHP(Laravel)使用COPY命令

DB::statement("COPY table_name FROM '".$file."' WITH DELIMITER ',' CSV HEADER")

但是如果由于superuser权限而失败:

  

必须是超级用户或pg_read_server_files角色的成员才能从文件进行COPY

     

提示:任何人都可以复制到stdout或从stdin中复制。 psql的\ copy命令也适用于任何人

因此,我试图在PHP中找到如何使用STDIN做同样的事情,但只能从命令行中找到示例。

所以我正在研究如何在PHP的STDIN中使用COPY?或者,也许还有另一种方法来批量插入50K +条记录。

P.S。我无法向用户添加superuser ROLE,因为该数据库托管在DigitalOcean上,并且他们拒绝授予superuser访问权限。

1 个答案:

答案 0 :(得分:1)

STDIN是文件的指针。参见stdin(3) - Linux manual page

  

每个符号都是一个指向{em> FILE 的类型指针的stdio(3)宏,可以与fprintf(3)fread(3)之类的函数一起使用。

因此,您can作为文件打开STDIN

<?php  
$stdin = fopen('php://stdin', 'r');  
DB::statement("COPY table_name FROM '".$stdin."' WITH DELIMITER ',' CSV HEADER")
?>

P.S。 DO的安全团队是对的:您不应该在日常任务中使用sueruser角色,无论是在DO的服务器上还是在其他任何地方。