嗨,我正在尝试从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
访问权限。
答案 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的服务器上还是在其他任何地方。