Golang版Postgres Testcontainers多初始化脚本执行异常问题
问题原因与解决方案
根因分析
你碰到的问题核心是Testcontainers的Postgres容器执行初始化脚本时,是按文件名的字典序来排序执行的:
- 你的
bands_init.sql以字母b开头,v1_create_bands.sql以v开头,字典序里b比v靠前,所以容器会先跑插入数据的脚本,这时候表还没创建,自然抛出relation "bands" does not exist错误。 - 当你把建表语句复制到
bands_init.sql后,容器先执行这个脚本创建了表,之后再跑v1_create_bands.sql时又执行一次建表操作,就会报relation "bands" already exists。 - 而单脚本里建表语句在前、插入语句在后,执行顺序正确,所以能正常运行。
解决办法
方法1:给脚本文件名加前缀控制执行顺序
修改两个脚本的文件名,让建表脚本排在前面:
- 把
v1_create_bands.sql改名为01_v1_create_bands.sql - 把
bands_init.sql改名为02_bands_init.sql
然后Go代码里的路径对应修改:
postgres.WithInitScripts( filepath.Join("..", "postgres_migrations", "01_v1_create_bands.sql"), filepath.Join("..", "tests", "postgres_scripts", "02_bands_init.sql"), ),
这样容器会按01→02的顺序执行脚本,先建表再插入数据,就不会报错了。
方法2:合并两个脚本为一个文件
直接把v1_create_bands.sql里的建表语句放到bands_init.sql的最前面,保持CREATE TABLE在前、INSERT在后的顺序,然后只传入这个合并后的脚本:
postgres.WithInitScripts( filepath.Join("..", "tests", "postgres_scripts", "bands_init.sql"), ),
这种方式你已经验证过可行,适合脚本内容不多的场景。
内容的提问来源于stack exchange,提问作者DiplomateProgrammer
相关产品推荐
相关产品推荐

