c - "Relation does not exist"错误,仅适用于 libpq

标签 c postgresql error-handling libpq

我正在尝试运行此查询,以使用 PQexec() (libpq) 从我的 C 代码向 Users 表插入新行

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

我检查了连接状态,它成功了,使用的是我从终端连接到的同一用户。为什么找不到用户表?

编辑:添加 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);

最佳答案

我要扣除:

 Error executing query: ERROR:  relation "users" does not exist

当数据库找不到表时会抛出这种错误( View ,或者wathelse可以通过SELECT,他给出了“关系”的名称)。所以你的代码看起来不错,但是一个子集原因可能是:

  • 表用户不存在。一些拼写错误
  • 您在错误的数据库中执行查询(未定义此表)
  • 您在错误的服务器中执行查询(如上所述)
  • 您在错误的架构中执行查询(如上所述)
  • 字符串从 sprintf 中截断。

和类似的。连接工作得很好,因为您从数据库中得到了答案

关于c - "Relation does not exist"错误,仅适用于 libpq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41168644/

相关文章:

c - 当我们调用 (char*)malloc(sizeof(char)) 为字符串分配内存时,它是否被初始化?如何初始化?

postgresql - 使用 LIMIT..OFFSET 时使用奇怪的 PostgreSQL 索引

c++ - C++中while循环中的浮点错误

c - 尝试释放 malloc 指针时出错

当我是 512 时,对 "i == (2^8)"的条件检查失败?

c# - 连接字符串不适用于 PostgreSQL

postgresql - 基于单列不触发的列约束

r - 是否可以为r中的错误编写if语句?

保留在表单页面上时的 PHP 错误处理

java - 引用数组引发与扫描仪有关的错误