在PostgreSQL JDBC中设置模式似乎无效。

3
我创建了名为"customer1"的模式,其中包含名为"user"的表格,并尝试使用Connection.setSchema()函数从JDBC连接到该模式:
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个回答

3

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"; 或者只需找到一个不会与内置函数冲突的表格名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接