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
相关产品推荐
相关产品推荐

