Как я могу вставить массив из нескольких записей, используя [libpg] метод «COPY FROM STDIN» в PostgreSQL? - PullRequest
0 голосов
/ 26 декабря 2018

Я использую 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"содержит данные для вставки.

Вставка завершается успешно, если она имеет следующую структуру:

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 голосов
/ 26 декабря 2018

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

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

COPY TestTable FROM STDIN with delimiter ',' CSV

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

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