2014-03-05 23 views
3

我試圖從新創建的表(它是在java代碼中創建的)獲取列列表。 問題是我沒有得到列。 代碼工作對於那些已經在數據庫表中,但如果我創建一個新的並嘗試獲取列信息立刻沒有找到任何...從jdbc/postgresql獲取新創建表的列元數據

更新: 下面是我用全碼測試:

@Test 
public void testtest() throws Exception { 
    try (Connection conn = dataSource.getConnection()) { 
     String tableName = "Table_" + UUID.randomUUID().toString().replace("-", ""); 
     try (Statement statement = conn.createStatement()) { 
      statement.executeUpdate(String.format("create table %s (id int primary key,name varchar(30));", tableName)); 
     } 
     DatabaseMetaData metaData = conn.getMetaData(); 
     try (ResultSet rs = metaData.getColumns(null, null, tableName, null)) { 
      int colsFound = 0; 
      while (rs.next()) { 
       colsFound++; 
      } 
      System.out.println(String.format("Found %s cols.", colsFound)); 
     } 
     System.out.println(String.format("Autocommit is set to %s.", conn.getAutoCommit())); 
    } 
} 

的和輸出:

Found 0 cols. 
Autocommit is set to true. 
+0

創建新表後關閉連接嗎? –

+0

是的,我關閉了兩個:聲明和連接。雖然我使用的DriverManagerDataSource獲取連接,所以它可能是它沒有關閉... – jmac

回答

5

問題是與你的表名的情況下:

String tableName = "Table_" 

由於這是一個帶引號的標識符(一件好事)這個名字當Postgres將其名稱存儲在系統目錄中時轉換爲小寫。

DatabaseMetaData的API調用是區分大小寫("Table_" = "table_"!),所以你需要通過小寫的表名:在標識如何使用

ResultSet rs = metaData.getColumns(null, null, tableName.toLowerCase(), null)) 

更多細節都在手冊中:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

+0

就是這樣。謝謝回覆。 – jmac

1

我做了簡單的測試,它似乎工作。我可以創建新表和使用PostgreSQL JDBC(我用的Jython)顯示其列:

conn = db.createStatement() 
conn.execute("CREATE TABLE new_table (id SERIAL, txt VARCHAR(200))") 
db_meta_data = db.getMetaData() 
for tbl_name in ('date_test', 'new_table'): 
    print('\n-- %s --' % (tbl_name)) 
    rs = db_meta_data.getColumns(None, None, tbl_name, None) 
    while (rs.next()): 
     print('%s:%s' % (rs.getString(3), rs.getString(4))) 
conn.close() 

這段代碼顯示列都已有表:date_test和剛剛創建new_table。我還在CREATE TABLE之後添加了一些代碼來關閉連接,但是我的結果總是相同並且正確。

也許這是你的JDBC驅動程序的問題。我從postgresql-9.3-1100.jdbc41.jar使用驅動程序。

這可能也是用戶權限問題。你是否使用同一個用戶來創建表和獲取元數據?在psqlpgAdmin或其他工具中是否顯示新表格?

其他原因是PostgreSQL也使用事務來處理模式更改。所以如果你禁用默認的自動提交併關閉連接,你的模式更改將會丟失。你用db.setAutoCommit(false)

您也可以直接查詢PostgreSQL模式:

SELECT DISTINCT table_name, column_name 
FROM information_schema.columns 
WHERE table_schema='public' 
AND table_name = 'new_table' 
ORDER BY 1, 2 
+0

你好,感謝您的答覆。我已將jdbc驅動程序更新爲您提到的驅動程序,但它沒有幫助。我使用相同的證書來創建表格並獲取te列信息。 – jmac

+0

所以唯一的想法是你在沒有提交的事務中創建表。 –

+0

好吧,我已經更新了我的第一篇文章。 autocommit設置爲true ... – jmac

0

奇怪地給傳遞表名稱以小寫getColumns方法不工作...感謝查詢MichałNiklas它讓我在正確的軌道上。

+0

哦,一旦我也有這個問題:-)現在我只關心在表或列名稱中只使用小寫字母。 –