Настройка схемы в PostgreSQL JDBC не работает - PullRequest
0 голосов
/ 18 мая 2018

Я создал схему «customer1» с таблицей «user» и пытаюсь подключить ее из JDBC с помощью Connection.setSchema ():

String url = "jdbc:postgresql://localhost/project";
Properties props = new Properties();
props.setProperty("user", "postgres");
props.setProperty("password", "postgres");

try (Connection conn = DriverManager.getConnection(url, props)) {
    conn.setSchema("customer1");

    try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SHOW search_path")) {
        rs.next();
        System.out.println("search_path: " + rs.getString(1));
    }

    try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT name FROM user LIMIT 1")) {
        if (rs.next()) {
            System.out.println("user name: " + rs.getString("name"));
        }
    }
}

Этот код печатает:

search_path: customer1

и затем он выдает PSQLException с сообщением:

ERROR: column "name" does not exist

Если я квалифицирую "пользовательскую" таблицу в запросе SELECT:

try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT name FROM customer1.user LIMIT 1")) {
    if (rs.next()) {
        System.out.println("user name: " + rs.getString("name"));
    }
}

, то она печатает:

search_path: customer1
user name: name1

и ошибки не возникает.Я использую драйвер JDBC 42.2.2 и сервер PostgreSQL 10.4.Почему настройка схемы не работает?

1 Ответ

0 голосов
/ 18 мая 2018

user - это встроенная функция (и ключевое слово).Таким образом, вы не можете использовать его в качестве имени таблицы:

psql (10.4)
Type "help" for help.

postgres=# select user;
   user
----------
 postgres
(1 row)

postgres=# select * from user;
   user
----------
 postgres
(1 row)

И поскольку это функция, у нее нет столбца name.

postgres=# select name from user;
ERROR:  column "name" does not exist
LINE 1: select name from user;
               ^
postgres=#

Если вы квалифицируете таблицу, то ясно, что вы ссылаетесь не на функцию, а на таблицу.

Вы можете либо всегда квалифицировать имя таблицы со схемой, либо использовать двойные кавычки : select name from "user";, либо просто найти имя таблицы, которое не вступает в противоречие со встроенными функциями.

...