我正在使用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"
有人可以帮我吗?
答案 0 :(得分:1)
请参见PostgreSQL docs。 COPY的默认格式不是CSV,而是文本。如果更改为CSV,则然后可以将带引号的单元格括起来,默认引号为"
。
因此,尝试
COPY TestTable FROM STDIN with delimiter ',' CSV
在带有,
的列周围用双引号引起来:
buffer[]="1,7.4,\"{1.5,2.3}\"\n"