Estoy intentando ejecutar esta consulta para insertar una nueva fila en la tabla Usuarios desde mi código C usando PQexec () (libpq)

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;

Realiza lo que necesito cuando lo ejecuto en la terminal psql, pero desde C devuelve

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

Verifiqué el estado de la conexión y se realizó correctamente, utilizando el mismo usuario al que me conecto desde la terminal. ¿Por qué no puede encontrar la tabla de usuarios?

EDITAR: agregando conexión de código C:

sprintf(connect_param,"host=address dbname=%s user=%s password=%s",
                                                    USERNAME, USERNAME, PASSWORD);
conn = PQconnectdb(connect_param);

Consulta:

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);
1
Vlad Keel 15 dic. 2016 a las 19:13

2 respuestas

La mejor respuesta

Voy por deducción:

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

Este tipo de error se produce cuando la base de datos no encuentra la tabla (view, o wathelse puede pasar a través de un SELECT, él da el nombre de "relación"). Entonces su código se ve bien, pero un subconjunto de razones puede ser:

  • los usuarios de la mesa no existe. Algún error de ortografía
  • realiza la consulta en la base de datos incorrecta (donde esta tabla no está definida)
  • realiza la consulta en el servidor incorrecto (como arriba)
  • realiza la consulta en el esquema incorrecto (como arriba)
  • La cadena se trunca del sprintf.

Y similares. La conexión funciona muy bien ya que obtienes una respuesta de la base de datos.

1
jurhas 16 dic. 2016 a las 11:12

Su problema de enlace de la biblioteca a la compilación.

gcc -I/usr/include/postgresql/ -L/usr/lib/postgresql/8.3/lib/ -lpq
0
benoit doll 15 dic. 2016 a las 16:26