【发布时间】:2016-12-15 16:13:31
【问题描述】:
我正在尝试运行此查询以使用 PQexec() (libpq) 从我的 C 代码向用户表中插入新行
INSERT INTO Users
VALUES ((
SELECT MIN(s.id)
FROM generate_series(1,(
SELECT GREATEST(MAX(Id) + 1,1) FROM Users
)) AS s(id)
WHERE NOT EXISTS (SELECT 1 FROM Users WHERE Id = s.id))
, 'Tester', 27)
RETURNING Id;
当我在 psql 终端中运行它时,它会执行我需要的操作,但是从 C 中它会返回
Error executing query: ERROR: relation "users" does not exist
我检查了连接状态,它成功了,使用我从终端连接的同一个用户。怎么找不到users表?
编辑:添加 C 代码 连接:
sprintf(connect_param,"host=address dbname=%s user=%s password=%s",
USERNAME, USERNAME, PASSWORD);
conn = PQconnectdb(connect_param);
查询:
sprintf(cmd, "INSERT INTO Users "
"VALUES (( "
"SELECT MIN(s.id) "
"FROM generate_series(1,( "
"SELECT GREATEST(MAX(Id) + 1,1) FROM Users "
" )) AS s(id) "
"WHERE NOT EXISTS (SELECT 1 FROM Users WHERE Id = s.id)) "
" , \'%s\', %d) "
"RETURNING Id;", Name, Age);
res = PQexec(conn,cmd);
【问题讨论】:
-
您能否发布您的实际 C 代码而不仅仅是查询
-
您的连接参数是否正确?您在发布的代码中使用了两次
USERNAME,一次用于dbname=%s,一次用于user=%s。 -
@IanAbbott 是的,它们是一样的。
-
psql 终端查询与 C 查询不太一样:
SELECT GREATEST(MAX(Id) + 1,1) FROM Users与SELECT GREATEST(MAX(Users.Id) + 1,1)。 -
对了,忘记复制上次的修改了……结果还是一样。
标签: c postgresql error-handling libpq