在 postgresql 中使用 \copy from php 插入 csv



我正在尝试从php脚本在postgresql数据库表中插入csv文件。

psql中使用命令copy时:

copy tablename(col1, col2, col3) FROM 'path/to/the/file.csv' DELIMITERS ',' CSV HEADER;

我没有遇到任何问题,但是在执行与 php 查询相同的命令时,我得到: 查询失败: 错误: 语法错误 在"\"处或附近 第 1 行: \copy ...:

$query = "copy tablename(col1, col2, col3) FROM 'path/to/the/file.csv' DELIMITERS ',' CSV HEADER";
$result = pg_query($conn, $query);
if (!$result) {
echo "An error occurred.n";
exit;
}

从PostgreSQL文档中我读到了这个

不要将 COPY 与 psql 指令 \copy 混淆。 \copy 调用 从 STDIN 复制或复制到 STDOUT,然后将数据获取/存储在 PSQL 客户端可访问的文件。因此,文件可访问性和 当 \copy 时,访问权限取决于客户端而不是服务器 被使用。

也许如果有人能向我解释这一点,我会更好地理解它。

我不是超级用户,所以我明白我不能使用 COPY,但是我认为如果我可以从 psgl 启动 \copy,我也可以在 PHP 中将其用作查询。

编辑

我的 CSV 示例

date,code,name,aut,data,lat,long
2017-06-08,431, one ,0, 11.1, 22.121,43.220
2017-06-08,321, two,1, 13.5,32.323,23.232
2017-06-08,210, three ,1, 19.5,23.432,43.232

桌子

CREATE TABLE table (
gid serial NOT NULL,
date timestamptz NOT NULL,
code bigint NOT NULL,
name character varying(50),
type boolean NOT NULL,
data smallint NOT NULL,
lat numeric(12,8),
long numeric(12,8),
the_geom geometry,
CONSTRAINT table_pkey PRIMARY KEY (gid)
);

关于 Laurenz Albe 的 PHP 回答:

$path = "path/to/the/file.csv";
$csv2array = array();
if (!$fp=fopen($path,"r")) echo "The file could not be opened.<br/>";  
while (( $data = fgetcsv ($fp)) !== FALSE ){
$data = str_replace(' ', '', $data);
$data = implode(" ",$data);
$csv2array[] = $data;
}
print_r($csv2array);

输出:

Array
(
[0] => 2017-06-08 431 one 0 11.1 22.121 43.220
[1] => 2017-06-08 321 two 1 13.5 32.323 23.232
[2] => 2017-06-08 210 three 1 19.5 23.432 43.232
)
copy

不是SQL命令,不能与PHP一起使用。

您可以将这些行读入数组并使用pg_copy_from()COPY ... FROM STDIN与 PHP 一起使用。

为此,您必须先将数据从文件读取到数组中。

最新更新