#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. следует изменить его ответ, чтобы адаптировать его к лучшему синтаксису