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

postgresql 简单查询处理过程

一个SQL查询循环是由前端发送一条 Query 消息给后端进行初始化的。 这条消息包含一个用文本字串表达的 SQL 命令(或者一些命令)。 后端根据查询命令字串的内容发送一条或者更多条响应消息给前端, 并且最后是一条 ReadyForQuery 响应信息。 ReadyForQuery 通知前端它可以安全地发送新命令了。 (实际上前端不必在发送其它命令之前等待 ReadyForQuery,但是这样一来, 前端必须负责区分早先发出的命令失败,而稍后发出的命令成功的情况。)

从后端来的可能的消息是:

CommandComplete

    一个 SQL 命令正常结束.

CopyInResponse

    后端已经准备好从前端拷贝数据到一个表里面去。

CopyOutResponse

    后端已经准备好从一个表里拷贝数据到前端里面去。

RowDescription

    表示为了响应一个 SELECT,FETCH,等的查询, 将要返回一个行。这条消息的内容
    描述了这行的字段布局。这条消息后面将跟着每个返回给前端的行一个的 DataRow 消息。

DataRow

    SELECT,FETCH,等查询返回的结果集中的一行。

EmptyQueryResponse

    识别了一个空的查询字串.

ErrorResponse

    出错了。

ReadyForQuery

    查询字串的处理完成。 发送一个独立的消息来标识这个是因为查询字串可能包含多个 SQL 命令。 
    (CommandComplete 只是标记一条 SQL 命令处理完毕,而不是整个字串。) ReadyForQuery 
    总会被发送,不管是处理成功结束还是产生错误。

NoticeResponse

    发送了一个与查询有关的警告信息。 注意信息是附加在其他响应上的,也就是说, 后端将继续处理该命令。

SELECT (或其它返回结果集的查询,比如 EXPLAIN 或 SHOW) 查询的响应信息通常包含 RowDescription,零个或者多个 DataRow 消息,以及最后的 CommandComplete。 从前端来回的 COPY 调用特殊的协议。 所有其他查询类型通常只生成一个 CommandComplete 消息。

因为查询字串可能包含若干个查询(用分号分隔), 所以在后端完成查询字串的处理之前可能有好几个这样的响应序列。 如果整个字串已经处理完,后端已经准备好接受新查询字串的时候则发出 ReadyForQuery 消息。

如果收到一个完全空(除了空白之外没有内容)的查询字串, 那么响应是一条 EmptyQueryResponse 后面跟着 ReadyForQuery。

在出现错误的时候,发出一个 ErrorResponse 消息,后面跟着 ReadyForQuery。 查询字串的所有后继的处理都被 ErrorResponse 中止(即使里面还有查询也这么干)。 请注意这些事情可能在处理一个查询产生的消息序列的中途发生。

在简单查询模式,检索出来的数值的格式总是文本的, 除非给出的命令是一个从一个声明了 BINARY 选项的游标上 FETCH。 在这种情况下,检索出来的数值是二进制格式的。在 RowDescription 消息里给出的格式代码告诉我们用了那种格式。

前端在等待其他类型的消息时必须准备接收 ErrorResponse 和 NoticeResponse 消息。

我们建议的方法是把前端代码写成状态机的风格,它可以在任何时刻接受任何有意义的信息,而不是写成假设消息的准确序列的代码.

    分享到:

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

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

postgresql 简单查询处理过程:等您坐沙发呢!

发表评论

*
快捷键:Ctrl+Enter