You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot运行时创建PostgreSQL Schema无效果问题排查

Spring Boot执行SQL脚本创建PostgreSQL Schema无效果问题

问题场景

在Spring Boot中通过代码执行SQL脚本创建PostgreSQL Schema,日志显示脚本已执行,但查询数据库却找不到目标Schema。

代码实现

public void myfunc() {
  executeSqlFile(getSqlFilePath("init_schema.sql"));
}
protected void executeSqlFile(String sqlFileName) {
  Resource resource = new ClassPathResource(sqlFileName);
  ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(resource);
  databasePopulator.execute(jdbcTemplate.getDataSource());
}

执行的SQL脚本(init_schema.sql)

CREATE SCHEMA IF NOT EXISTS "account_controller_integration_test";
CREATE SCHEMA IF NOT EXISTS "account_controller_using_hikari_integration_test";
CREATE SCHEMA IF NOT EXISTS "account_controller_using_memcached_integration_test";
CREATE SCHEMA IF NOT EXISTS "gojek_helper_controller_integration_test";
CREATE SCHEMA IF NOT EXISTS "integration_failure_controller_integration_test";

日志信息

[] ... INFO o.s.j.datasource.init.ScriptUtils - Executing SQL script from class path resource [sql/init_schema.sql]
[] ... INFO o.s.j.datasource.init.ScriptUtils - Executed SQL script from class path resource [sql/init_schema.sql] in 8 ms.

查询结果

执行以下查询:

select schema_name
from information_schema.schemata;

返回结果中无目标Schema:

schema_name
-----------
pg_toast
pg_catalog
public
information_schema

排查与解决步骤

1. 确认数据库连接一致性

检查jdbcTemplate连接的数据库和你查询时用的数据库是否为同一个:

  • 在代码中添加查询当前数据库的语句,验证连接的库:
    String currentDb = jdbcTemplate.queryForObject("SELECT current_database()", String.class);
    System.out.println("当前连接数据库:" + currentDb);
    
  • 对比你查询时使用的数据库,确保两者一致,避免创建的Schema在其他库中。

2. 处理Schema名称大小写问题

PostgreSQL对带双引号的标识符区分大小写,注意以下两种情况:

  • 如果脚本中用双引号定义Schema名称(如"account_controller_integration_test"),查询时必须带双引号才能匹配:
    select schema_name from information_schema.schemata where schema_name = "account_controller_integration_test";
    
  • 或者去掉脚本中的双引号,让Schema名称自动转为小写(PostgreSQL默认行为),这样无需双引号即可查询到:
    CREATE SCHEMA IF NOT EXISTS account_controller_integration_test;
    

3. 验证数据库用户权限

确认执行脚本的用户是否拥有创建Schema的权限:

  • 执行以下SQL检查权限:
    SELECT has_database_privilege(current_user, current_database(), 'CREATE');
    
  • 如果返回f,说明用户无权限,执行授权语句:
    GRANT CREATE ON DATABASE your_database_name TO your_user;
    

4. 开启详细SQL日志排查

开启更细粒度的日志,确认SQL语句是否正确发送到数据库:
在application.properties中添加:

logging.level.org.springframework.jdbc=DEBUG
logging.level.org.postgresql=DEBUG

通过日志查看实际执行的SQL和数据库返回结果,确认脚本是否真正执行成功。

5. 手动执行脚本验证

将init_schema.sql中的语句复制到PostgreSQL客户端(如psql、pgAdmin)手动执行:

  • 如果手动执行也无法创建Schema,说明脚本本身存在问题;
  • 如果手动执行成功,说明代码执行逻辑存在异常,需进一步排查数据源配置或ResourceDatabasePopulator的使用。

内容的提问来源于stack exchange,提问作者Justin Xu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:55:29