0

简而言之

如果列有注释,你如何使用st Hibernatelongblob从 MySQL 迁移到 Postgres ?pgloader@Lob@Basic(fetch= FetchType.LAZY)

全文

所以我正在迁移(或至少尝试)将 MySQL DB 迁移到 postgres。我现在正试图正确移动这张桌子: 在此处输入图像描述

我当前的 pgloader 脚本相当简单:

LOAD DATABASE
    FROM      mysql://foo:bar@localhost:3306/foobar
    INTO postgresql://foo:bar@localhost:5432/foobar

    CAST
        type int to integer drop typemod,
        type bigint with extra auto_increment to bigserial drop typemod,
        type bigint to bigint drop typemod

    ALTER TABLE NAMES MATCHING 'User' RENAME TO 'users'
    ALTER TABLE NAMES MATCHING ~/./ SET SCHEMA 'public'
;

这足以加载数据并使外键正常工作。

postgres 表如下所示:

在此处输入图像描述

然而File,它是一个 java 实体,它的内容被注释@Lob

@Entity
@Inheritance(strategy= InheritanceType.JOINED)
public class File extends BaseEntity {

    @NotNull
    private String name;

    @Column
    @Size(max = 4096)
    private String description;

    @NotNull
    private String mimeType;

    @Lob
    @Basic(fetch= FetchType.LAZY)
    private transient byte[] content;

    ...

}

这就是应用程序无法连接到迁移的数据库并出现错误的原因:

Schema-validation: wrong column type encountered in column [content] in table [File];
                   found [bytea (Types#BINARY)], but expecting [oid (Types#BLOB)]

我如何让这个迁移工作?

我确实尝试设置

spring.jpa.properties.hibernate.jdbc.use_streams_for_binary=false

正如byte[] 的适当休眠注释中所建议的那样,但这没有做任何事情。

4

1 回答 1

2

嗯...我想我可以在事后创建 blob,正如Migrate PostgreSQL text/bytea column to large object 所建议的那样?

这意味着迁移脚本将获得扩展名:

LOAD DATABASE
    FROM      mysql://foo:bar@localhost:3306/foobar
    INTO postgresql://foo:bar@localhost:5432/foobar

    CAST
        type int to integer drop typemod,
        type bigint with extra auto_increment to bigserial drop typemod,
        type bigint to bigint drop typemod

    ALTER TABLE NAMES MATCHING 'User' RENAME TO 'users'
    ALTER TABLE NAMES MATCHING ~/./ SET SCHEMA 'public'

    AFTER LOAD DO
        $$
            ALTER TABLE file RENAME COLUMN content TO content_bytes;
        $$,
        $$
            ALTER TABLE file ADD COLUMN content OID;
        $$,
        $$
            UPDATE file SET
                content = lo_from_bytea(0, content_bytes::bytea),
                content_bytes = NULL
            ;
        $$,
        $$
            ALTER TABLE file DROP COLUMN content_bytes
        $$
;
于 2020-08-11T14:35:30.027 回答