关系doe不存在错误,只有libpq

时间:2016-12-15 16:13:31

标签: 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);

2 个答案:

答案 0 :(得分:1)

我要去扣除:

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

当数据库找不到表时(视图,或者wathelse可以通过SELECT,他给出"关系"的名称)这种错误就抛出了。所以你的代码看起来很像很好,但一系列原因可以是:

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

和类似的。由于您从数据库中得到答案,因此连接效果非常好

答案 1 :(得分:0)

你的库链接到编译的问题。

gcc -I/usr/include/postgresql/ -L/usr/lib/postgresql/8.3/lib/ -lpq