COPY FROM STDIN 在 liquibase 中不起作用

Mar*_*güe 6 postgresql liquibase

我正在尝试使用 Postgresql 的 COPY 命令从 .sql 文件上传大量数据。我的这些数据采用file.sql以下格式:

COPY my_table(id, name, status)  FROM stdin; 
1   peter  active
1   steve  active
1   maria  active
\.
Run Code Online (Sandbox Code Playgroud)

我的变更集是这样的:

<changeSet id="sqlFile-example" author="me" >
        <sqlFile encoding="UTF-8"
                 path="file.sql"
                 relativeToChangelogFile="true"
                 endDelimiter=";"
                 splitStatements="false"
        />
 </changeSet>
Run Code Online (Sandbox Code Playgroud)

并得到这个错误:

[错误] 无法在项目 lincoln-soft 上执行目标 org.liquibase:liquibase-maven-plugin:3.6.3:update (default-cli):设置或运行 Liquibase 时出错:更改集 src/main/resources 迁移失败/db/liquibase/db-changelog.xml::sqlFile-example::me

[错误] 原因:liquibase.exception.DatabaseException:错误:从标准输入复制期间出现意外消息类型 0x50

[错误] 其中:COPY my_table,第 1 行 [失败的 SQL:COPY my_table(id, name, status) FROM stdin;

[错误] 1 彼得活跃

[错误] 1 史蒂夫活跃

[错误] 1 玛丽亚活跃

[错误] \。]

我有办法通过 liquibase 上传这些数据吗?

Mar*_*güe 6

终于得到了一个解决方案,正如@a_horse_with_no_name和@Laurenz Albe提到的,不能COPY FROM STDIN直接在JDBC中使用,所以我用来pg_dump生成这样的插入语句:

pg_dump --table=public.my_table --data-only --column-inserts my_databse > /tmp/my_table_data.sql

它给了我一个my_table_data.sql包含如下插入语句的文件:

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);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

这个对我有用


小智 3

正如 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
Run Code Online (Sandbox Code Playgroud)

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

id,name,status
1,peter,active
1,steve,active
1,maria,active
Run Code Online (Sandbox Code Playgroud)