Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从jdbc/postgresql获取新创建表的列元数据_Java_Postgresql_Jdbc - Fatal编程技术网

Java 从jdbc/postgresql获取新创建表的列元数据

Java 从jdbc/postgresql获取新创建表的列元数据,java,postgresql,jdbc,Java,Postgresql,Jdbc,我试图从新创建的表中获取列列表(它是在java代码中创建的)。 问题是我没有得到列。 该代码适用于数据库中已经存在的表,但是如果我创建一个新表并尝试立即获取列信息,它将找不到任何 更新: 以下是我用于测试的完整代码: @Test public void testtest() throws Exception { try (Connection conn = dataSource.getConnection()) { String tableName = "Table_"

我试图从新创建的表中获取列列表(它是在java代码中创建的)。 问题是我没有得到列。 该代码适用于数据库中已经存在的表,但是如果我创建一个新表并尝试立即获取列信息,它将找不到任何

更新: 以下是我用于测试的完整代码:

@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.

我做了一个简单的测试,看起来很有效。我可以使用PostgreSQL JDBC创建新表并显示其列(我使用Jython):

此代码显示已存在表的列:
date\u test
,以及刚创建的
新表的列。我还添加了一些代码来关闭
CREATE TABLE
之后的连接,但我的结果总是相同和正确的

也许这是JDBC驱动程序的问题。我使用postgresql-9.3-1100.jdbc41.jar中的驱动程序

用户权限也可能有问题。创建表和获取元数据是否使用同一用户?新表是否在
psql
pgAdmin
或其他工具中可见

另一个原因是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 

问题在于您的tablename的大小写:

String tableName = "Table_" 
ResultSet rs = metaData.getColumns(null, null, tableName.toLowerCase(), null))
因为这是一个不带引号的标识符(一件好事),所以当Postgres将其名称存储在系统目录中时,名称将转换为小写

DatabaseMetaData API调用区分大小写(
“Table_u”
!=
“Table_”
),因此需要传递小写的tablename:

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

有关标识符如何使用的更多详细信息,请参见手册:

奇怪的是,将表名以小写形式传递给getColumns方法确实有效……感谢MichałNiklas的查询,它使我走上了正确的轨道。

创建新表后是否关闭连接?是的,我同时关闭了语句和连接。虽然我正在使用DriverManager数据源来获取连接,所以它可能没有关闭…您好,谢谢您的回复。我已经将jdbc驱动程序更新为您提到的驱动程序,但没有任何帮助。我在bot创建表和获取te列信息时使用相同的凭据。因此,唯一的想法是在未提交的事务中创建表。您是否在
psql
中看到此表?我使用PostgreSQL架构查询更新了我的答案。你能把它添加到你的测试代码中而不是查询元数据并向我们展示结果吗?这就是问题所在。谢谢你的回复。哦,曾经我也遇到过这个问题:-)现在我只想在表或列名中使用小写字母。