postgresql COPY FROM STDIN在liquibase中不起作用

tkqqtvp1  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(315)

我试图使用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上传这些数据?

wi3ka0sx

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语句:

INSERT INTO public.my_table (id, name, status) VALUES (1,peter,active);
INSERT INTO public.my_table (id, name, status) VALUES (1,peter,active);
INSERT INTO public.my_table (id, name, status) VALUES (1,peter,active);

然后我使用这个liquibase Chageset来上传sql文件:

<changeSet id="sqlFile-example" author="me" >
     <sqlFile encoding="UTF-8"
           path="my_table_data.sql"
           relativeToChangelogFile="true"
           splitStatements="true"
           stripComments="true"
     />
</changeSet>

对我很有效

fae0ux8s

fae0ux8s2#

正如Laurenz所说:你不能在JDBC中直接使用COPY FROM STDIN(你可以使用CopyManager API手动实现,但Liquibase不支持,我也不知道有任何插件可以做到这一点)
我建议您使用Liquibase的内置功能来加载CSV(文本)文件。将您的输入数据放入CSV文件中,例如my_table_data.txt,列的标题行为:

id,name,status
1,peter,active
1,steve,active
1,maria,active

然后使用<loadData>而不是运行SQL脚本:

<changeSet id="sqlFile-example" author="me" >
        <loadData tableName="my_table"
                  file="my_table_data.txt" 
                  separator=","
                  encoding="UTF-8">
</changeSet>
bweufnob

bweufnob3#

COPY语句和数据混合在同一文件中只适用于psql脚本。
JDBC驱动程序中支持COPY,但必须显式使用CopyManager
您应该在脚本中使用INSERT语句。如果您想用JDBC驱动程序加载pg_dump,请使用pg_dump --inserts(但可能会降低性能)。

相关问题