java - 在 PostgreSQL JDBC 中设置模式似乎不起作用
问题描述
我使用表“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)
而且因为它是一个函数,所以它没有 column name
。
postgres=# select name from user;
ERROR: column "name" does not exist
LINE 1: select name from user;
^
postgres=#
如果您限定了表格,那么很明显您不是在引用函数,而是表格。
您可以始终使用模式限定表名,或使用双引号:select name from "user";
或简单地查找不与内置函数冲突的表名。
推荐阅读
- jupyter-notebook - 当 Jupyter Hub 中的 Python 文件很大时,无法添加目录扩展
- azure-data-factory - 在 .net 核心中使用 .NET SDK 创建 Azure 数据工厂?
- arrays - Hackerrank 中 numpy 的眼睛和身份功能。为什么测试用例失败了?
- uwp - CalendarDatePicker,TodayDate 在 UWP 中没有突出显示?
- python - 如果该行与DataFrame中的其他行有一定关系,如何删除行?
- node.js - 如何使用 node.js 和 pm2 将 verdaccio 发布到互联网?
- sql - sql中存储过程的嵌套循环不起作用
- c++ - 为什么我在提交leetcode时会报错,但在IDE中使用相同的代码?
- retrofit2 - 带有 Retrofit 2 的 kotlinx 序列化中的构建错误
- python - 我刚刚开始用 Python 制作一个基本的交互式计算器,但不知道为什么它不接受给定的输入