Java SQL «ОШИБКА: отношение «имя_таблицы» не существует»

#java #sql #postgresql #quoted-identifier

#java #sql #postgresql #идентификатор в кавычках

Вопрос:

Я пытаюсь подключить netbeans к моей базе данных postgresql. Соединение, похоже, сработало, поскольку я не получаю никаких ошибок или исключений при простом подключении, такие методы, как getCatalog (), также возвращают правильные ответы.

Но когда я пытаюсь выполнить простую инструкцию SQL, я получаю ошибку «ОШИБКА: отношение «ИМЯ_ТАБЛИЦЫ» не существует», где ИМЯ_ТАБЛИЦЫ — это любая из моих таблиц, которые существуют в базе данных. Вот мой код:

     Statement stmt = con.createStatement();

    ResultSet rs;

    String query = "SELECT * FROM clients";

    rs = stmt.executeQuery(query);
  

Я подумал, что netbeans, возможно, не находит таблицы, потому что он не ищет в схеме по умолчанию (общедоступной), есть ли способ установить схему в java?

РЕДАКТИРОВАТЬ: мой код подключения. Имя базы данных — Cinemax, когда я пропускаю код инструкции, я не получаю ошибок.

     String url = "jdbc:postgresql://localhost:5432/Cinemax";
    try{

    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException cnfe) {
        System.err.println("Couldn't find driver class:");
        cnfe.printStackTrace();
    }

    Connection con = DriverManager.getConnection( url,"postgres","desertrose147");
  

Комментарии:

1. Вы не можете переписать sql таким образом? SELECT * FROM <schem_name>.clients

2. Вы не показываете, как вы подключаетесь к серверу базы данных. Я подозреваю, что @CoolBeans правильно указано выше или очень близко. Ваша таблица находится в другой схеме (которую исправит приведенное выше) или в другой базе данных, отличной от той, которую вы указали при подключении.

3. Мне это нравится … не могли бы вы показать нам РЕАЛЬНУЮ ошибку, которая у вас есть? Я не думаю, что база данных выдает «имя_таблицы отношения …» при выполнении «выбрать * из клиентов».

4. Я пробовал это, но получаю ту же ошибку: «ОШИБКА: отношение «public.clients» не существует» (то же самое для любой другой из моих таблиц). public — моя единственная схема, поэтому это также схема по умолчанию. Пока спасибо за помощь.

5. Установите log_min_duration_statement равным 0 в postgresql.conf, перезапустите базу данных, запустите приложение и проверьте в журналах postgresql, какой реальный запрос отправляется в базу данных. И еще одна вещь… вы на 100% уверены, что у вас есть таблица там? Можете ли вы подключиться к этой базе данных с помощью psql / pgadmin и выполнить запрос там?

Ответ №1:

Я подозреваю, что вы создали таблицу, используя двойные кавычки, используя, например, "Clients" или какую-либо другую комбинацию символов верхнего / нижнего регистра, и поэтому имя таблицы теперь чувствительно к регистру.

Что означает утверждение

  SELECT table_schema, table_name
 FROM information_schema.tables 
 WHERE lower(table_name) = 'clients'
  

возврат?

Если возвращаемое имя таблицы не в нижнем регистре, вы должны использовать двойные кавычки при обращении к нему, что-то вроде этого:

 String query = "SELECT * FROM "Clients"";
  

Комментарии:

1. Я пытаюсь использовать sequelize ORM, и в его запросе create он использует кавычки для имя_таблицы. Спасибо за ответ.

Ответ №2:

Вы могли бы проверить эти возможности:

 String query = "SELECT * FROM clients";
String query = "SELECT * FROM CLIENTS";
String query = "SELECT * FROM "clients"";
String query = "SELECT * FROM "CLIENTS"";
String query = "SELECT * FROM Clients";
  

Возможно, одно из них сработало бы.

Комментарии:

1. Первый, второй и последний операторы ссылаются на одно и то же имя таблицы.

Ответ №3:

Помимо предложения CoolBeans, вы также можете подключаться к базе данных как другой пользователь, у которого нет прав доступа к соответствующей базе данных или схеме. Можете ли вы показать строку подключения?

Комментарии:

1. Я единственный пользователь базы данных (пользователь postgres / root), поскольку это всего лишь небольшая база данных, которую я использую для изучения postgresql. Я включил строку подключения в редактирование в моем первоначальном вопросе. Пока спасибо за помощь.

Ответ №4:

Забавно, что я столкнулся с тем же, с чем только что начал работать в netbeans и postgressql db, и ошибка была исправлена после того, как заметил, что проблема заключалась в том, что мои таблицы в postgressql имели заглавные буквы в моем соглашении об именовании, из-за чего мне и моей инструкции запроса jdbc для INSERT не удавалось найти таблицу. Но после переименования моих таблиц в БД и исправления имен столбцов я готов к работе. Надеюсь, это поможет.

Комментарии:

1. следует изменить его ответ, чтобы адаптировать его к лучшему синтаксису