Как я могу вставить массив из нескольких записей, используя [libpg] метод "COPY FROM STDIN" в PostgreSQL?

Я использую libpq для вставки больших объемов данных из программы на Си.

Объемные данные содержат тип данных, представляющий собой двойной массив, который в 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 ответ

Решение

Смотрите документы PostgreSQL. Формат по умолчанию для COPY - это не CSV, а текст. Если вы измените на CSV, вы можете заключить ячейку в кавычки, по умолчанию это ",

Следовательно, попробуйте

COPY TestTable FROM STDIN with delimiter ',' CSV

с двойными кавычками вокруг столбцов с ,:

buffer[]="1,7.4,\"{1.5,2.3}\"\n" 
Другие вопросы по тегам