繁体   English   中英

在PostgreSQL JDBC中设置架构似乎不起作用

[英]Setting schema in PostgreSQL JDBC doesn't seem to work

我使用表“ user”创建了模式“ customer1”,并尝试使用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。 为什么设置架构不起作用?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM