Flyway迁移成功但PostgreSQL执行\dt无关系表的问题求助
问题1:Flyway挂载路径配置错误,未正确读取迁移脚本
你的文件结构中迁移脚本存放在migration/sql/V1__transaction_events.sql,但Docker Compose中Flyway的挂载配置为./migration:/flyway/sql,这会导致脚本实际位于容器内的/flyway/sql/sql/路径下,Flyway默认不会递归扫描子目录,因此没有执行任何迁移,所谓的「校验成功」其实是无迁移脚本时的空成功提示。
修复方案:修改docker-compose.yml中Flyway的volumes配置为:
volumes: - ./migration/sql:/flyway/sql
问题2:查询时未指定schema
你在Flyway配置中指定了-schemas=wallet,迁移脚本也将表建在wallet schema下,PostgreSQL默认执行\dt仅查询public schema下的表,自然看不到结果。Flyway默认会自动创建指定的schema,无需额外手动创建。
修复方案:
查询表时执行\dt wallet.*即可查看对应schema下的表,也可以执行SET search_path TO wallet, public;修改当前会话的默认搜索路径,后续直接执行\dt就能看到wallet schema下的表。
问题3:数据库Dockerfile配置冗余且路径错误
你的utils/db.Dockerfile中写了COPY ../init.sql /docker-entrypoint-initdb.d/,Docker构建时上下文默认是docker-compose.yml所在的根目录,../会超出上下文范围导致复制失败,init.sql根本不会生效。同时你已经在docker-compose.yml的db服务环境变量中指定了POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB,PostgreSQL官方镜像会自动创建对应的用户和数据库,完全不需要额外的init.sql和自定义Dockerfile重复配置。
修复方案:
删除utils/db.Dockerfile和init.sql,直接使用官方postgres镜像即可,修改docker-compose.yml的db服务配置,去掉冗余的build段:
db: container_name: postgres-db environment: POSTGRES_PASSWORD: testuser1234 POSTGRES_USER: test_user POSTGRES_DB: wallet image: postgres:13 ports: - "5432:5432" restart: always
验证步骤
- 执行
docker compose down -v删除之前的存量卷,避免旧的错误数据库数据残留 - 执行
docker compose up --build重新启动所有服务,查看flyway容器日志可以看到Successfully applied 1 migration的提示,代表迁移执行成功 - 登录数据库执行
\dt wallet.*即可看到创建的transaction_events表
内容的提问来源于stack exchange,提问作者befoca1956

