2012-02-12 32 views
6

Khi tôi sử dụng postgresql, tôi thấy đoạn mã sau:Có đúng là "ResultSet.getMetaData.getTableName (col)" của trình điều khiển jdbc của postgresql luôn trả về một chuỗi rỗng không?

Statement stmt = conn.createStatement(); 
ResultSet rs = stmt.executeQuery("select * from t"); 

String tableName = rs.getMetaData().getTableName(1); 
System.out.println(tableName); 

It in một chuỗi rỗng.

Vì vậy, tôi đã kiểm tra mã nguồn và tìm thấy phương thức org.postgresql.jdbc2.AbstractJdbc2ResultSetMetaData#getTableName luôn trả về một chuỗi trống.

Mã nguồn là:

public abstract class AbstractJdbc2ResultSetMetaData implements PGResultSetMetaData { 

    /* 
    * @param column the first column is 1, the second is 2... 
    * @return column name, or "" if not applicable 
    * @exception SQLException if a database access error occurs 
    */ 
    public String getTableName(int column) throws SQLException 
    { 
     return ""; 
    } 
} 

Bạn có thể thấy nó chỉ trả về một "".

Tôi tìm thấy một cuộc thảo luận về vấn đề này, vui lòng xem: http://archives.postgresql.org/pgsql-jdbc/2009-12/msg00100.php

Họ nghĩ "rs.getMetaData.getTableName (col)" nên trả lại tên bí danh trong truy vấn không phải là tên bảng bên dưới. Nhưng rất khó để thực hiện, vì vậy tốt hơn là để trống.

Ngoài ra họ đã đưa ra một phương pháp để có được tên bảng, sử dụng:

PGResultSetMetaData.getBaseTableName() 

mẫu:

ResultSet rs = stmt.executeQuery("select * from x"); 
// convert it to PGResultSetMetaData 
PGResultSetMetaData meta = (PGResultSetMetaData)rs.getMetaData(); 
String tableName = meta.getBaseTableName(1); 

Bây giờ nó có thể in các tên bảng chính xác.

Tôi không biết việc thực hiện postgresql là chính xác, nhưng trả về tên bảng cơ bản hữu ích hơn nhiều so với một chuỗi rỗng, và, hầu hết các cơ sở dữ liệu khác cung cấp tên bảng bên dưới thay vì một chuỗi rỗng.

Tôi gặp sự cố khi sử dụng khung anorm của play2 với postgesql: Play2's anorm can't work on postgresql, nhưng hoạt động tốt trên cơ sở dữ liệu khác.

Bạn nghĩ gì khi triển khai đúng trình điều khiển jdbc của postgresql? Trả về một chuỗi rỗng, tên bảng cơ bản, hoặc cái gì khác?

Trả lời

3

Tôi có thể nói rằng việc trả về một chuỗi rỗng rõ ràng là việc triển khai giao diện không chính xác, vì tên bảng không bao giờ được coi là chuỗi rỗng. Vấn đề mà tôi tin rằng họ đang gặp khó khăn là trong khi việc triển khai hiện tại của họ là sai, một khi họ chọn triển khai, họ sẽ bị mắc kẹt với nó cho đến khi họ quyết định phá vỡ sự phụ thuộc vào hành vi là chấp nhận được. Do đó, họ chọn thêm phương thức có tên rõ ràng và cung cấp dữ liệu mà hầu hết người dùng mong đợi đến từ getTableName và để thực hiện rõ ràng phương pháp getTableName cho đến khi đạt được một số đồng thuận. được gửi thực hiện sự đồng thuận.

Phản ứng ruột của tôi là phương pháp getTableName phải trả lại bí danh đang được sử dụng cho bảng đó. Một bảng có thể được nối với chính nó, và sử dụng bí danh sẽ cho phép bạn xác định cái nào đang được tham chiếu. Một bảng có thể đã được tạo ra trong truy vấn (chẳng hạn như không cần một mảng), và do đó thậm chí không có tên bảng trong cơ sở dữ liệu. Nếu bạn đưa ra quyết định "tuyệt đối luôn luôn, getTableName trả về bí danh", thì ít nhất người dùng biết điều gì sẽ xảy ra; nếu không, bạn kết thúc với nó không được rõ ràng những gì phương pháp nên trở lại.

Tuy nhiên, ngay cả khi tôi cho rằng phản ứng ruột của tôi là "việc triển khai chính xác", nó sẽ làm tăng vấn đề tương thích. Điều mong muốn là có thể chuyển từ một DBMS khác sang PostgreSQL với ít đầu tư nhất có thể, nếu một trong những mục tiêu của PostgreSQL là phát triển phổ biến. Do đó, những thứ như “các JDBC khác thực hiện các giao diện java.sql như thế nào?” Trở nên có liên quan. Như bạn nói, một khuôn khổ tồn tại có kỳ vọng về cách thực hiện ResultSetMetaData và có thể không phải là khung duy nhất có kỳ vọng nhất định về cách giao diện java.sql sẽ được triển khai.

Bất kỳ triển khai nào mà họ chọn sẽ trở thành một sự cân bằng, vì vậy tôi có thể thấy lý do tại sao "đá xuống có thể xuống đường" là lựa chọn của họ. Khi họ chọn sự cân bằng mà họ muốn thực hiện, họ sẽ bị khóa.

CHỈNH SỬA: Tôi khuyên bạn nên loại trừ một ngoại lệ liên quan đến việc không được triển khai sẽ tốt hơn là chỉ im lặng. Tôi hy vọng rằng các khuôn khổ dựa vào việc thực hiện cụ thể của getTableName sẽ không có nhiều sử dụng cho chuỗi rỗng anyway, và một trong hai lỗi hoặc bản thân họ không âm thầm.

Các vấn đề liên quan