如何在 PostgreSQL 中使用 [libpg] "COPY FROM STDIN" 方法插入多条目数组?

How can I insert multi-entry array using [libpg] "COPY FROM STDIN" method in PostgreSQL?

我正在使用 libpq 从 C 程序中插入批量数据。

批量数据包含的数据类型是double数组,在PostgreSQL中是float8[]。

我的平台是Windows10,PostgreSQL 11.

测试的table结构如下:

create table TestTable(
    a  int4,
    b  float8,
    c  float8[]
)

C代码如下:

void OutputRes(int i)
{
    int         Status;
    char        sql[SQLLEN]= "COPY TestTable FROM STDIN with(delimiter ',');";
    PGconn     *conn = NULL;
    PGresult   *res;
    char buffer[] = "1,7.4,'{1.5}'\n";

    conn = PQconnectdb(CONNSTR);
    if (PQstatus(conn) != CONNECTION_OK) {
         printf("Connection failed: %s", PQerrorMessage(conn));
    }

    res = PQexec(conn, "COPY TestTable FROM STDIN with(delimiter ',');");
    if (PQresultStatus(res) != PGRES_COPY_IN) {
        printf("Not in COPY_IN mode\n");
    }
    PQclear(res);
    Status = PQputCopyData(conn, buffer, strlen(buffer));
    Status = PQputCopyData(conn, buffer, strlen(buffer));
    Status = PQputCopyEnd(conn, NULL);

    res = PQexec(conn, "COMMIT;");
    if (PQresultStatus(res) != PGRES_COMMAND_OK) {
        printf("BEGIN command failed: %s", PQerrorMessage(conn));
    }
    PQclear(res);
    PQfinish(conn);
}

而"buffer"变量包含要插入的数据。

如果结构如下,则插入成功:

buffer[]="1,7.4,{1.5}\n"

但是如果我尝试在数组中插入多个条目,则插入不起作用并且没有错误消息。

buffer[]="1,7.4,{1.5,2.3}\n"

此外,我尝试了以下方法,均失败。

buffer[]="1,7.4,\"{1.5,2.3}\"\n" 
buffer[]="1,7.4,'{1.5,2.3}'\n"

有人可以帮我解决这个问题吗?

参见PostgreSQL docs。 COPY 的默认格式不是 CSV,而是文本。如果您更改为 CSV,则 然后 您可以用引号将单元格括起来,默认引号为 ".

因此,尝试

COPY TestTable FROM STDIN with delimiter ',' CSV

在带有 ,:

的列周围用双引号引起来
buffer[]="1,7.4,\"{1.5,2.3}\"\n"