Отношение не существует, ошибка только с libpq

Я пытаюсь выполнить этот запрос, чтобы вставить новую строку в таблицу Users из моего кода C, используя 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;

Он выполняет то, что мне нужно, когда я запускаю его в терминале 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);

person Vlad Keel    schedule 15.12.2016    source источник
comment
можете ли вы опубликовать свой фактический код C, а не просто запрос   -  person Ahmed Masud    schedule 15.12.2016
comment
Верны ли параметры подключения? Вы дважды использовали USERNAME в коде, который вы разместили, один раз для dbname=%s и один раз для user=%s.   -  person Ian Abbott    schedule 15.12.2016
comment
@IanAbbott да, они одинаковые.   -  person Vlad Keel    schedule 15.12.2016
comment
Терминальный запрос psql отличается от запроса C: SELECT GREATEST(MAX(Id) + 1,1) FROM Users против SELECT GREATEST(MAX(Users.Id) + 1,1).   -  person Ian Abbott    schedule 15.12.2016
comment
Да, забыл скопировать последнее изменение... но результат тот же.   -  person Vlad Keel    schedule 15.12.2016


Ответы (2)


Я иду на вычет:

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

Этот тип ошибки возникает, когда базы данных не находят таблицу (представление или wathelse могут пройти через SELECT, он дает имя «отношения»). Таким образом, ваш код выглядит нормально, но подмножество причин может быть:

  • пользователей таблицы не существует. Какая-то орфографическая ошибка
  • вы выполняете запрос не в той базе данных (где эта таблица не определена)
  • вы выполняете запрос не на том сервере (как указано выше)
  • вы выполняете запрос в неправильной схеме (как указано выше)
  • Строка усекается из sprintf.

и подобные. Соединение работает очень хорошо, так как вы получаете ответ из базы данных

person jurhas    schedule 16.12.2016

ваша проблема с ссылкой на библиотеку для компиляции.

gcc -I/usr/include/postgresql/ -L/usr/lib/postgresql/8.3/lib/ -lpq
person benoit doll    schedule 15.12.2016
comment
не думаю... я компилирую с библиотекой, и у меня нет ошибок компиляции или компоновки. - person Vlad Keel; 15.12.2016