Postgres JDBC 驱动程序未返回错误行号,如 PGAdmin 中所示
Postgres JDBC driver not returning error line number as shown in PGAdmin
Postgres JDBC 驱动程序未返回准确的错误行号,如 PGAdmin 中所示。当我 运行 下面的程序时:
import java.sql.*;
public class Test {
public static void main(String[] args) {
String query = "SELECT table_name, table_type\n" +
" FROM information_schema.tabls\n" +
" WHERE table_schema='public'\n" +
" AND table_type in ('BASE TABLE','VIEW') ORDER BY table_type, table_name;";
try (Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres")) {
System.out.println("Connected to PostgreSQL database!");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
System.out.printf("%-30.30s %-30.30s%n", resultSet.getString("table_name"), resultSet.getString("table_type"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
我收到以下错误:
org.postgresql.util.PSQLException: ERROR: relation "information_schema.tabls" does not exist
Position: 38
但是当我 运行 在 pgadmin4 上进行相同的查询时,我收到以下错误:
ERROR: relation "information_schema.tabls" does not exist
LINE 2: FROM information_schema.tabls
^
SQL state: 42P01
Character: 38
我也想要 java 程序中的行号。我怎样才能得到它?
PGAdmin4 是一个使用 Python 驱动程序 psycopg2
的 node.js 后端。此驱动程序只不过是名为 libpq
的 C 驱动程序的包装器,由 PostgreSQL 团队创建。
JDBC 驱动程序与数据库通信并使用从服务器收到的响应。 org.postgresql.core.v3.QueryExecutorImpl#receiveNoticeResponse
负责解析服务器错误的私有方法,它只是创建新的 org.postgresql.util.ServerErrorMessage
实例。因此,服务器给出的响应等于 JDBC 驱动程序显示的响应。
但是对于libpq
,从服务器接收到的消息和在客户端显示的消息是不一样的。 libpq
sources 中有 reportErrorPosition
方法就是用来添加行信息的。这是 reference for reportErrorPosition sources for PostgreSQL 13.3. Here is place where LINE: x is added 给客户端的错误。
总结
使用JDBC驱动需要自行计算行号。或使用为您完成的 C 库。
Postgres JDBC 驱动程序未返回准确的错误行号,如 PGAdmin 中所示。当我 运行 下面的程序时:
import java.sql.*;
public class Test {
public static void main(String[] args) {
String query = "SELECT table_name, table_type\n" +
" FROM information_schema.tabls\n" +
" WHERE table_schema='public'\n" +
" AND table_type in ('BASE TABLE','VIEW') ORDER BY table_type, table_name;";
try (Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres")) {
System.out.println("Connected to PostgreSQL database!");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
System.out.printf("%-30.30s %-30.30s%n", resultSet.getString("table_name"), resultSet.getString("table_type"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
我收到以下错误:
org.postgresql.util.PSQLException: ERROR: relation "information_schema.tabls" does not exist
Position: 38
但是当我 运行 在 pgadmin4 上进行相同的查询时,我收到以下错误:
ERROR: relation "information_schema.tabls" does not exist
LINE 2: FROM information_schema.tabls
^
SQL state: 42P01
Character: 38
我也想要 java 程序中的行号。我怎样才能得到它?
PGAdmin4 是一个使用 Python 驱动程序 psycopg2
的 node.js 后端。此驱动程序只不过是名为 libpq
的 C 驱动程序的包装器,由 PostgreSQL 团队创建。
JDBC 驱动程序与数据库通信并使用从服务器收到的响应。 org.postgresql.core.v3.QueryExecutorImpl#receiveNoticeResponse
负责解析服务器错误的私有方法,它只是创建新的 org.postgresql.util.ServerErrorMessage
实例。因此,服务器给出的响应等于 JDBC 驱动程序显示的响应。
但是对于libpq
,从服务器接收到的消息和在客户端显示的消息是不一样的。 libpq
sources 中有 reportErrorPosition
方法就是用来添加行信息的。这是 reference for reportErrorPosition sources for PostgreSQL 13.3. Here is place where LINE: x is added 给客户端的错误。
总结
使用JDBC驱动需要自行计算行号。或使用为您完成的 C 库。