如何在 PostgreSQL 中使用 [libpg] "COPY FROM STDIN" 方法插入多条目数组?
How can I insert multi-entry array using [libpg] "COPY FROM STDIN" method in PostgreSQL?
我正在使用 libpq 从 C 程序中插入批量数据。
批量数据包含的数据类型是double数组,在PostgreSQL中是float8[]。
我的平台是Windows10,PostgreSQL 11.
测试的table结构如下:
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"
有人可以帮我解决这个问题吗?
参见PostgreSQL docs。 COPY 的默认格式不是 CSV,而是文本。如果您更改为 CSV,则 然后 您可以用引号将单元格括起来,默认引号为 "
.
因此,尝试
COPY TestTable FROM STDIN with delimiter ',' CSV
在带有 ,
:
的列周围用双引号引起来
buffer[]="1,7.4,\"{1.5,2.3}\"\n"
我正在使用 libpq 从 C 程序中插入批量数据。
批量数据包含的数据类型是double数组,在PostgreSQL中是float8[]。
我的平台是Windows10,PostgreSQL 11.
测试的table结构如下:
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"
有人可以帮我解决这个问题吗?
参见PostgreSQL docs。 COPY 的默认格式不是 CSV,而是文本。如果您更改为 CSV,则 然后 您可以用引号将单元格括起来,默认引号为 "
.
因此,尝试
COPY TestTable FROM STDIN with delimiter ',' CSV
在带有 ,
:
buffer[]="1,7.4,\"{1.5,2.3}\"\n"