使用Flyway迁移脚本时如何从文件读取数据填充数据库表?
错误原因分析
- PostgreSQL的
COPY FROM默认读取的是数据库服务端的本地文件系统路径,你填写的/sql_scripts/user.txt是项目类路径,数据库服务无法识别该路径,这是报错的核心原因 - 你创建的表名为
users,原COPY语句中写的profile是主键约束名而非表名,表名不匹配也会触发报错 - 未指定导入列:
users表第一列是自动生成的UUID字段id,原COPY语句未指定导入列,会默认尝试匹配所有列,和txt里的2个字段数量不匹配 user是PostgreSQL保留关键字,直接作为字段名使用需要加引号包裹
修复方案
方案一:改用INSERT语句(最稳妥,无路径依赖)
直接把测试数据写为Flyway版本化的INSERT脚本,不需要依赖外部txt文件,修改copy.sql内容如下:
INSERT INTO users (em, "user") VALUES ('m@mai.com', 'sara'), ('s@yandex.ru', 'jacobs');
方案二:保留COPY逻辑的修改方式
如果必须用COPY命令导入txt,按以下步骤修改:
- 把txt文件路径改为数据库服务可访问的绝对路径,比如你本地项目对应的路径
/Users/xxx/你的项目名/src/main/resources/sql_scripts/user.txt - 修正COPY语句的表名、列名、解析参数:
COPY users (em, "user") FROM '替换为你的txt文件绝对路径' DELIMITER ',' NULL '\null' QUOTE '''';
- 可选调整:可以去掉
user.txt里字段前后的单引号,同时去掉COPY语句里的QUOTE ''''参数,减少格式匹配问题
Flyway适配优化建议
如果要让导入逻辑随项目打包无路径依赖,建议把数据文件放在src/main/resources/db-migration目录下,或者直接转为INSERT语句作为版本化迁移脚本,避免生产环境文件路径不一致的问题。
内容的提问来源于stack exchange,提问作者skyho
相关产品推荐
相关产品推荐

