Как я могу вставить массив из нескольких записей, используя [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"