当前位置: 首页 > Database, postgresql > 正文

postgresql copy 命令执行

postgresql使用copy命令导入导出表中的数据

COPY 命令允许在服务器和客户端之间高速的大批量数据传输。 拷贝入和拷贝出操作每个都把连接切换到一个独立的子协议中,并且持续到操作结束。

拷贝入模式(数据传输到服务器)是在后端执行一个 COPY FROM STDIN SQL 语句的时候初始化的。 后端发送一个 CopyInResponse 消息给前端。前端应该发送零条或者更多 CopyData 消息,形成一个输出数据的流。 (消息的边界和行的边界没有任何相关性要求,尽管通常那就是合理的边界选择。) 前端可以通过发送一个 CopyDone 消息来终止拷贝入操作(允许成功终止),也可以发出一个 CopyFail 消息(它将导致 COPY SQL 语句带着错误失败)。 然后后端就恢复回它在 COPY 开始之前的命令处理模式,可能是简单查询协议, 也可能是扩展查询协议。然后它会发送 CommandComplete (如果成功)或者 ErrorResponse (如果失败)。

如果在拷贝入模式下后端检测到了错误(包括接受接收到 CopyFiail 消息, 或者是任何除了 CopyData 或者 CopyDone 之外的前端消息), 那么后端将发出一个 ErrorResponse 消息。如果 COPY 命令是通过一个扩展的查询消息发出的, 那么后端从现在开始将抛弃前端消息,直到一个 Sync 消息到大,然后它将发出 ReadyForQuery 并且返回到正常的处理中。 如果 COPY 命令是在一个简单查询消息里发出的,那么该消息剩余部分被丢弃然后发出 ReadyForQuery 消息。 不管是哪种情况,任何前端发出的 CopyData,CopyDone,或者 CopyFail 消息都将被简单地抛弃。

拷贝出模式(数据从服务器发出)是在后端执行一个 COPY TO STDOUT SQL 语句的时候初始化的。 后端发出一个 CopyOutResponse 消息给前端,后面跟着零或者多个 CopyData 消息(总是每行一个), 然后跟着 CopyDone。然后后端回退到它在 COPY 开始之前的命令处理模式,然后发送 CommandComplete。 前端不能退出传输(除非是关闭连接或者发出一个 Cancel 请求),但是它可以抛弃不需要的 CopyData 和 CopyDone 消息。

在拷贝出模式中,如果后端检测到错误,那么它将发出一个 ErrorResponse 消息并且回到正常的处理。 前端应该把收到 ErrorResponse(或者实际上除了 CopyData 或者 CopyDone 之外的任何消息类型)当作终止拷贝出模式的标志。

CopyInResponse 和 CopyOutResponse 消息包括告诉前端每行的字段数以及每个字段使用的格式代码的信息。 (就目前的实现而言,某个 COPY 操作的所有字段都使用同样的格式,但是消息设计并不做这个假设。)

    分享到:

本文固定链接: http://klwang.info/postgresql-copy-message/ | 数据库|Linux|软件开发

该日志由 klwang 于2014年01月13日发表在 Database, postgresql 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: postgresql copy 命令执行 | 数据库|Linux|软件开发
关键字: ,

postgresql copy 命令执行:等您坐沙发呢!

发表评论

*
快捷键:Ctrl+Enter