使用COPY命令导出Postgres 9.6 text数据类型

时间:2017-08-03 05:16:07

标签: postgresql copy export

我有一个postgres 9.6表,其中有一个文本列,其中包含HTML格式的电子邮件内容。所以它里面有各种各样的人物。我需要将其导出并导入到Redshift数据库中。我尝试了带有各种分隔符的COPY命令 - |,〜^但它仍然失败,因为这些字符是text数据类型。
我尝试使用封闭引号的CSV,但这导致文本数据跨越多行。 我运行的一些命令 -

- 从Postgres出口

psql -d messsagedb  -c "copy (SELECT body FROM messages limit 3)  to  STDOUT (DELIMITER '^')

- 在Redshift中导入

COPY public.messages FROM 's3://xxx/messages_stub2.txt' iam_role 'arn:aws:iam::xxx' delimiter '^'; 

此操作失败,显示消息 - 无效时间戳(因为正文中有" ^"在其中)

- 使用二进制或csv从postgres导出

psql -d messagedb  -c "copy (SELECT body FROM messages limit 3)  to  STDOUT (format csv) " 

- 复制到Redshift失败并显示错误 - "定界值缺少结束引用"

以下示例数据。当我使用CSV时,电子邮件正文跨越多行。因此,即使我在COPY中的SELECT语句具有LIMIT 1,输出也会产生大约50行

"86b599b2-e0fb-4f16-b026-6aedefd52e76","3266841",,"July 15th Skills Camp Update","
    <div>

                <div style=""clear: both;padding-top: 15px"">
        <table cellpadding=""1"" cellspacing=""1"" width=""100%"">
            <tbody>
<tr>
                <td>
                    <img alt="""" src=""https://www.frontrush.com//userfiles/591/email%xx.jpg"" style=""width: 933px; height: 350px;"">
<table border=""1"" cellpadding=""1"" cellspacing=""1"" style=""width: 933px;"">
        <tbody>
                <tr>
                        <td style=""text-align: center;"">
<br>
                        <span style=""font-size:72px;""><span style=""font-family:Tahoma,Geneva,sans-serif;""><u>Methodist University Football</u></span></span><br>
                        <br>
                        <br>
                        <br>
                        <font><span style=""font-size: 48px;"">At this time, the online registration has been closed for the July 15th Camp! Walk-ups are still accepted and welcomed! We look forward to seeing you here.</span></font><br> 

关于可以使用的罕见单字节分隔符的任何想法?我可以使用其他任何COPY选项吗?不幸的是,pg_dump不是一个选项,因为我需要在这个表上运行一个SELECT。

由于 穆拉利

1 个答案:

答案 0 :(得分:0)

我喜欢使用ASCII字段分隔符来实现此用途。它仍然可能在那里,但我发现它不太可能比任何其他角色。

实施例: DELIMITER E'\x1f'