我试图使用PostgreSQL的COPY命令从.sql文件上传大量数据。我有一个file.sql
的数据:
COPY my_table(id, name, status) FROM stdin;
1 peter active
1 steve active
1 maria active
\.
我的变更集是这样的:
<changeSet id="sqlFile-example" author="me" >
<sqlFile encoding="UTF-8"
path="file.sql"
relativeToChangelogFile="true"
endDelimiter=";"
splitStatements="false"
/>
</changeSet>
得到这个错误:
[错误]无法执行目标org.liquibase:liquibase-maven-plugin:3.6.3:update(default-cli)on project lincoln-soft:设置或运行Liquibase时出错:更改集src/main/resources/db/liquibase/db-changelog.xml::sqlFile-example::me的迁移失败
[错误]原因:liquibase.exception.DatabaseException:错误:从标准输入复制期间意外的消息类型0x 50
[错误]此处:COPY my_table,line 1 [Failed SQL:COPY my_table(id,name,status)FROM stdin;
[ERROR] 1 peter active
[ERROR] 1 steve active
[错误] 1个maria active
[错误] .]
我有没有办法通过liquibase上传这些数据?
3条答案
按热度按时间wi3ka0sx1#
最后得到了一个解决方案,正如@a_horse_with_no_name和@Laurenz Albe提到的,不能直接在JDBC中使用
COPY FROM STDIN
,所以我使用pg_dump
生成insert语句,如下所示:pg_dump --table=public.my_table --data-only --column-inserts my_databse > /tmp/my_table_data.sql
它给了我一个
my_table_data.sql
文件,其中包含如下inserts语句:然后我使用这个liquibase Chageset来上传sql文件:
对我很有效
fae0ux8s2#
正如Laurenz所说:你不能在JDBC中直接使用COPY FROM STDIN(你可以使用CopyManager API手动实现,但Liquibase不支持,我也不知道有任何插件可以做到这一点)
我建议您使用Liquibase的内置功能来加载CSV(文本)文件。将您的输入数据放入CSV文件中,例如
my_table_data.txt
,列的标题行为:然后使用
<loadData>
而不是运行SQL脚本:bweufnob3#
将
COPY
语句和数据混合在同一文件中只适用于psql
脚本。JDBC驱动程序中支持
COPY
,但必须显式使用CopyManager
。您应该在脚本中使用
INSERT
语句。如果您想用JDBC驱动程序加载pg_dump
,请使用pg_dump --inserts
(但可能会降低性能)。