如何在PostgreSQL中使用[libpg]“从STDIN复制”方法插入多条目数组?

时间:2018-12-26 10:14:58

标签: c postgresql libpq

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

批量数据包含的数据类型为双精度数组,在PostgreSQL中为float8 []。

我的平台是Windows 10,PostgreSQL 11。

测试表的结构如下:

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[]="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"

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

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

因此,尝试

COPY TestTable FROM STDIN with delimiter ',' CSV

在带有,的列周围用双引号引起来:

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