文档库 最新最全的文档下载
当前位置:文档库 › PostgreSQL数据库学习手册之libpq

PostgreSQL数据库学习手册之libpq

PostgreSQL数据库学习手册之libpq
PostgreSQL数据库学习手册之libpq

PostgreSQL数据库学习手册之libpq - C 库--介绍(转)[@more@]

Chapter 1. libpq - C 库

Table of Contents

1.1. 介绍

1.2. 数据库联接函数

1.3. 命令执行函数

1.3.1. 主过程

1.3.

2. 为包含在 SQL 查询中逃逸字串

1.3.3. 逃逸包含在 SQL 查询中的二进制字串

1.3.4. 检索 SELECT 的结果信息

1.3.5. 检索 SELECT 结果数值

1.3.6. 检索非-SELECT 结果信息

1.4. 异步查询处理

1.5. 捷径接口

1.6. 异步通知

1.7. 与 COPY 命令相关的函数

1.8. libpq 跟踪函数

1.9. libpq 控制函数

1.10. 环境变量

1.11. 文件

1.1

2. 线程特性

1.13. 制作 Libpq 程序

1.14. 例子程序

1.1. 介绍

libpq 是 PostgreSQL的 C 应用程序员的接口. libpq 是一套允许客户程序向 PostgreSQL 后端服务进程发送查询并且获得查询返回的库过程. libpq 同时也是其他几个 PostgreSQL 应用接口下面的引擎,包括 libpq++ (C++), libpgtcl(Tcl),Perl,和 ecpg.所以如果你使用这些软件包, libpq某些方面的特性会对你非常重要.

本节末尾有三个小程序显示如何利用 libpq书写程序.在下面目录里面有几个完整的 libpq 应用的例子:src/test/examples

src/bin/psql

使用 libpq 的前端程序必须包括头文件 libpq-fe.h 并且必须与 libpq 库链接.

PostgreSQL数据库学习手册之libpq-C库---数据库联接函数(转)[@more@]

1.2. 数据库联接函数

下面的过程处理与 PostgreSQL 后端服务器联接的事情.一个应用程序一次可以与多个后端建立联接.(这么做的原因之一是访问多于一个数据库.)每个连接都是用一个从PQconnectdb()或PQsetdbLogin() 获得的PGconn对象表示.注意,这些函数总是返回一个非空的对象指针,除非存储器少得连个PGconn对象都分配不出来.在把查询发送给联接对象之前,可以调用PQstatus 函数来检查一下联接是否成功.

*

PQconnectdb 与后端数据库服务器建立一个新的联接.

PGconn *PQconnectdb(const char *conninfo)

这个过程用从一个字符串 conninfo 来的参数与数据库打开一个新的联接.与下面的PQsetdbLogin()不同的是,我们可以不必更换函数签名(名字)就可以扩展参数集,所以我们建议应用程序中使用这个函数或者是它的非阻塞的相似函数 PQconnectStart 和 PQconnectPoll.传入的参数可以为空,表明使用所有缺省的参数,或者可以包含一个或更多个用空白间隔的参数设置.

每个参数以关键字 = 数值的形式设置. (要写一个空值或者一个包含空白的值,你可以用一对单引号包围它们,例如, keyword = 'a value' .数值内部的单引号和反斜扛必须用一个反斜扛逃逸,也就是说,'或.) 等号周围的空白是可选的.目前可识别的参数键字是:

host

要联接的主机(host ).如果主机名以斜扛开头,则它声明使用 Unix 域套接字通讯而不是 TCP/IP 通讯;该值就是套接字文件所存储的目录.缺省时是与位于 /tmp 里面的 Unix-域套接字联接.

hostaddr

与之联接的主机的 IP 地址。这个可以是标准的数字-点的形式,象在 BSD 函数inet_aton等里面用的那样。如果声明了一个非零长的字符串,那么使用 TCP/IP 通讯机制。

使用hostaddr取代 host 可以让应用避免一次主机名查找,这一点对于那些有时间约束的应用来说可能是非常重要的。不过,Kerberos 认证系统要求主机(host)名。因此,应用下面的规则。如果声明了不带hostaddr的 host 那么就强制进行主机名查找。如果声明中没有 host,hostaddr 的值给出远端的地址;如果使用了 Kerberos,将导致一次反向名字查询。如果同时声明了 host 和hostaddr,除非使用了 Kerberos,否则将使用hostaddr的值作为远端地址; host 的值将被忽略,如果使用了 Kerberos,host 的值用于 Kerberos 认证。要注意如果传递给libpq的主机名(host)不是地址hostaddr处的机器名,那么认证很有可能失败。

如果主机名(host)和主机地址都没有,那么libpq将使用一个本地的 Unix 域套接字进行通讯。

port

主机服务器的端口号,或者在 Unix 域套接字联接时的套接字扩展文件名.

dbname

数据库名.

user

要联接的用户名。

password

如果后端要求口令认证,所用的口令.

connect_timeout

给连接过程设置的时间范围,以秒计。零或者不设置表示无穷。

options

发给后端的跟踪/调试选项.

tty

文件或控制台(tty),用于从后端的可选调试输出.

requiressl

设为 '1' 要求与后端进行 SSL 联接.如果服务器不支持 SSL,那么Libpq将马上拒绝联接.设置为 '0' (缺省)与服务器进行协商.

如果有任何没有声明的参数,那么将检查对应的环境变量(参阅Section 1.10 小节)。如果环境变量也没有设置,那么使用编译时的硬代码。返回的值是一个指向代表与后端联接的抽象 struct指针。

*

PQsetdbLogin 与后端数据库服务器建立一个新的联接.

PGconn *PQsetdbLogin(const char *pghost,

const char *pgport,

const char *pgoptions,

const char *pgtty,

const char *dbName,

const char *login,

const char *pwd)

这个函数是 PQconnectdb 前身,它有固定个数的参数,但是有相同的功能。

*

PQsetdb 与后端数据库服务器建立一个新的联接.

PGconn *PQsetdb(char *pghost,

char *pgport,

char *pgoptions,

char *pgtty,

char *dbName)

这是一个调用 PQsetdbLogin() 的宏,只是login和pwd参数用空(null )代替.提供这个函数主要是为了与老版本的程序兼容.

*

PQconnectStart, PQconnectPoll 与数据库服务器建立一次非阻塞的联接。

PGconn *PQconnectStart(const char *conninfo)

PostgreSQLPollingStatusType PQconnectPoll(PGconn *conn)

这两个过程用于打开一个与数据库服务器之间的非阻塞的联接:你的应用的执行线索在执行它的时候不会因远端的 I/O 而阻塞。

数据库联接是用从 conninfo字符串里取得的参数传递给 PQconnectStart进行的。这个字符串的格式与上面PQconnectdb里描述的一样。

PQconnectStart 和PQconnectPoll 都不会阻塞(进程),不过有一些条件:

o

必须正确提供hostaddr和host 参数以确保不会发生正向或者反向的名字查找。参阅上面PQconnectdb 里的这些参数的文档获取细节。

o

如果你调用了PQtrace,确保你跟踪进入的流对象不会阻塞。

o

你必须在调用PQconnectPoll之前确保 socket 处于正确的状态,象下面描述的那样。

要开始(联接),调用 conn=PQconnectStart("connection_info_string") .如果conn是NULL,表明libpq无法分配一个新的 PGconn 结构。否则,返回一个有效的PGconn指针(尽管还不一定代表一个与数据库有效联接)。 PQconnectStart 一返回,调用 status=PQstatus(conn)。如果 status 等于CONNECTION_BAD, PQconnectStart 失败。

如果PQconnectStart成功了,下一个阶段是轮询 libpq,这样它就可以继续进行后继的联接动作。象这样循环:认为一个联接缺省时是"不活跃"的。如果PQconnectPoll的最后一个返回是

PGRES_POLLING_ACTIVE,则认为它是"活跃的"。如果PQconnectPoll(conn)的最后一个返回是

PGRES_POLLING_READING,执行一个对 PQsocket(conn)的读select()。如果最后一个返回是

PGRES_POLLING_WRITING,执行一个对PQsocket(conn)的写select()。如果还要调用PQconnectPoll,也就是调用完PQconnectStart之后,把它当作最后返回PGRES_POLLING_WRITING那样对待。如果select()显示 socket 已经准备好,那么认为它是"活跃的"。如果认为一个联接是 "活跃的",再次调用PQconnectPoll(conn)。如果这次调用返回PGRES_POLLING_FAILED,联接过程失败,如果这次调用返回PGRES_POLLING_OK,联接成功。

要注意上面用select()来确保一个 socket 准备好只是一个(近似)的例子;还可以用其他方法,比如一个poll()调用,来代替 select。

在联接的任意时刻,我们都可以通过调用PQstatus 来检查联接的状态。如果这是CONNECTION_BAD,那么联接过程失败;如果是CONNECTION_OK,那么联接已经做好。这两种状态同样也可以从上面的PQconnectPoll 的返回值里检测到。其他状态可能(也只能)在一次异步联接过程中看到。这些标识联接过程的当前状态,因而可能对给用户提供反馈有帮助。这些状态可能包括:

CONNECTION_STARTED

等待进行联接。

CONNECTION_MADE

联接成功;等待发送。

CONNECTION_AWAITING_RESPONSE

等待来自服务器的响应。

CONNECTION_AUTH_OK

已收到认证;等待联接启动继续进行。

CONNECTION_SETENV

协商环境(联接启动的一部分)。

注意,尽管这些常量将保持下去(为了维持兼容性),应用决不应该依赖于这些常量的某种特定顺序,或者是根本不应依赖于这些常量,或者是不应该依赖于这些状态总是某个文档声明的值。一个应用可能象象下面这样:

switch(PQstatus(conn))

{

case CONNECTION_STARTED:

feedback = "Connecting...";

break;

case CONNECTION_MADE:

feedback = "Connected to server...";

break;

.

.

.

default:

feedback = "Connecting...";

}

要注意如果PQconnectStart返回一个非空的指针,你必须在使用完它(指针)之后调用PQfinish,以处理那些结构和所有相关的存储块。甚至调用PQconnectStart或者 PQconnectPoll失败时也要这样处理。如果编译libpq时定义了USE_SSL 那么目前的PQconnectPoll将阻塞住。这个限制可能在将来的版本移除。

这些函数把 socket 置于一个非阻塞的状态,就好象调用了 PQsetnonblocking 一样。

*

PQconndefaults 返回缺省的联接选项。

PQconninfoOption *PQconndefaults(void)

struct PQconninfoOption

{

char *keyword; /* The keyword of the option */

char *envvar; /* Fallback environment variable name */

char *compiled; /* Fallback compiled in default value */

char *val; /* Option's current value, or NULL */

char *label; /* Label for field in connect dialog */

char *dispchar; /* Character to display for this field

in a connect dialog. Values are:

"" Display entered value as is

"*" Password field - hide value

"D" Debug option - don't show by default */

int dispsize; /* Field size in characters for dialog */

}

返回联接选项结构的地址.可以用于获取所有可能的PQconnectdb选项和它们的当前缺省值.返回值指向一个PQconninfoOption struct 的数组,该数组以一个有 NULL 关键字指针的条目结束.注意缺省值(val 域)将依赖于环境变量和其他上下文.调用者必须把联接选项当作只读对待.

在处理完选项数组后,把数组交给PQconninfoFree()释放.如果没有这么做,每次调用PQconndefaults() 都会有一小部分内存泄漏.

在PostgreSQL7.0 以前的版本, PQconndefaults() 返回一个指向静态数组的指针,而不是一个动态分配的数组.这样做是线程不安全的,因此这个特点被修改了.

*

PQfinish 关闭与后端的联接.同时释放被PGconn 对象使用的存储器.

void PQfinish(PGconn *conn)

注意,即使与后端的联接尝试失败(可由PQstatus判断),应用也要调用PQfinish释放被PGconn 对象使用的存储器.不应该在调用 PQfinish后再使用PGconn 指针.

*

PQreset 重置与后端的通讯端口.

void PQreset(PGconn *conn)

此函数将关闭与后端的联接并且试图与同一个服务器重建新的联接,使用所有前面使用过的参数.这在失去工作联接后进行故障恢复时很有用.

*

PQresetStart PQresetPoll 以非阻塞模式重置与后端的通讯端口。

int PQresetStart(PGconn *conn);

PostgreSQLPollingStatusType PQresetPoll(PGconn *conn);

此函数将关闭与后端的联接并且试图与同一个服务器重建新的联接,使用所有前面使用过的参数.这在失去工作联接后进行故障恢复时很有用.它们和上面的PQreset的区别是它们工作在非阻塞模式。这些函数的使用有与上面PQconnectStart和 PQconnectPoll一样的限制。

调用PQresetStart。如果它返回 0,那么重置失败。如果返回 1,用与使用PQconnectPoll 建立联接的同样的方法使用PQresetPoll重置联接。

libpq应用程序员应该仔细维护PGconn结构.使用下面的访问函数来获取PGconn的内容.避免直接引用PGconn结构里的字段,因为这些字段在今后可能被改变.(从 PostgreSQL 版本 6.4 开始, struct PGconn 的定义甚至没有放在 libpq-fe.h里.如果你有一些直接访问PGconn数据域的旧代码,你可以通过包含libpq-int.h 来访问它们,但我们鼓励你赶快修改那些代码.)

*

PQdb 返回联接的数据库名.

char *PQdb(const PGconn *conn)

PQdb 和下面几个函数返回联接时建立起来的几个值.这些值在PGconn对象的生存期内是固定的.

*

PQuser 返回联接的用户名.

char *PQuser(const PGconn *conn)

*

PQpass 返回联接的口令.

char *PQpass(const PGconn *conn)

*

PQhost 返回联接的服务器主机名.

char *PQhost(const PGconn *conn)

*

PQport 返回联接的端口号.

char *PQport(const PGconn *conn)

*

PQtty 返回联接的调试控制台( tty ).

char *PQtty(const PGconn *conn)

*

PQoptions 返回联接中使用的后端选项.

char *PQoptions(const PGconn *conn)

*

PQstatus 返回联接的状态.

ConnStatusType PQstatus(const PGconn *conn)

这个状态可以是一些值之一。不过,如果不是一次异步联接过程的话,我们只能看到其中的两个 - CONNECTION_OK 或 CONNECTION_BAD。一个与数据库的成功的联接返回状态 CONNECTION_OK。一次失败的企图用状态 CONNECTION_BAD 标识。通常,一个 OK 状态保持到 PQfinish,但是一个通讯失败可能会导致状态过早地改变为 CONNECTION_BAD 。这时应用可以试着调用 PQreset 来恢复.

参阅PQconnectStart和PQconnectPoll 条目看看可能出现的其他的状态码。

*

PQerrorMessage 返回联接中操作产生的最近的错误信息.

char *PQerrorMessage(const PGconn* conn);

几乎所有libpq函数在失败时都会设置 PQerrorMessage.注意libpq的传统是,一个非空的PQerrorMessage 将在结尾包含一个新行.

*

PQbackendPID 返回控制此联接的后端服务器的进程号ID。

int PQbackendPID(const PGconn *conn);

这个后端PID 在调试和对比 NOTIFY 信息(包含发出通知的后端的 PID )时很有用.注意该 PID 属于运行数据库服务器的主机的进程,而不是本地主机!

*

PQgetssl 返回联接使用的 SSL 结构,或者如果 SSL 没有使用的话返回 NULL.

SSL *PQgetssl(const PGconn *conn);

这个结构可以用于核实加密级别,检查服务器认证等信息.参考 SSL 文档获取关于这个结构的更多信息.为了获取这个函数的原形,你必须定义 USE_SSL.这样做会自动包含来自OpenSSL的 ssl.h.

PostgreSQL数据库学习手册之libpq-C库----命令执行函数(转)[@more@]

1.3. 命令执行函数

一旦与数据库服务器的联接成功建立,便可用这里描述的函数执行 SQL 查询和命令。

1.3.1. 主过程

*

PQexec 给服务器提交一条命令并且等待结果.

PGresult *PQexec(PGconn *conn,

const char *query);

返回一个PGresult指针或者也可能是一个 NULL 指针.通常返回一个非空(non-NULL)的指针,除非没有内存或发生了象不能把命令发送到后端这样的严重错误.如果返回的是 NULL,它应该被当作

PGRES_FATAL_ERROR结果处理.用PQerrorMessage获取有关错误的更多信息.

PGresult 结构封装了后端返回的结果. libpq 应用程序员应该仔细维护PGresult抽象.用下面的访问函

(从数来获取PGresult的内容.避免直接引用 PGresult结构的数据域,因为这个结构可能会在未来被改变.PostgreSQL 版本 6.4 开始, struct PGresult的定义甚至都没有放在 libpq-fe.h里.如果你有一些直接访问 PGresult数据域的老代码,你可以通过包含libpq-int.h继续使用它们,但是我们鼓励你立刻修改代码.)

*

PQresultStatus 返回命令的结果状态.

ExecStatusType PQresultStatus(const PGresult *res)

PQresultStatus可以返回下面数值之一:

o

PGRES_EMPTY_QUERY -- 发送给后端的字串是空的

o

PGRES_COMMAND_OK -- 成功完成一个没有返回数据的命令

o

PGRES_TUPLES_OK -- 成功执行查询

o

PGRES_COPY_OUT -- (从服务器)Copy Out (拷贝出)数据传输开始

o

PGRES_COPY_IN -- Copy In (拷贝入)(到服务器)数据传输开始

o

PGRES_BAD_RESPONSE -- 服务器的响应无法理解

o

PGRES_NONFATAL_ERROR

o

PGRES_FATAL_ERROR

如果结果状态是 PGRES_TUPLES_OK ,那么可以用下面的过程从查询的返回中抽取元组信息.注意一个碰巧检索了零条元组的 SELECT 仍然显示 PGRES_TUPLES_OK。 PGRES_COMMAND_OK用于不返回元组的命令(INSERT,UPDATE,等)。返回 PGRES_EMPTY_QUERY 的响应通常意味着客户端软件里面的臭虫。

*

PQresStatus 把PQresultStatus返回的枚举类型转换成一个描述状态码的字符串常量。

char *PQresStatus(ExecStatusType status);

*

PQresultErrorMessage 返回与查询关联的错误信息,或在没有错误时返回一个空字符串.

char *PQresultErrorMessage(const PGresult *res);

紧跟在一个 PQexec 或 PQgetResult 调用后面,PQerrorMessage (对联接)将返回与PQresultErrorMessage (对结果)一样的字符串.不过,一个PGresult将保有其错误信息直到被删除,而连结的错误信息将在后续的操作完成时被改变.当你想知道与某个 PGresult相关联的状态时用PQresultErrorMessage ;当你想知道与联接的最近一个操作相关联的状态时用 PQerrorMessage;

*

PQclear 释放于PGresult相关联的存储空间.任何不再需要的查询结果在不需要的时候都应该用PQclear释放掉.

void PQclear(PQresult *res);

你可以保留PGresult对象任意长的时间;当你提交新的查询时它并不消失,甚至你断开联接后也是这样.要删除它,你必须调用 PQclear.不这么做将导致前端的存储器泄漏.

*

PQmakeEmptyPGresult 构造一个给出状态的为空的PGresult对象.

PGresult* PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);

这是libpq的内部过程,用于分配和初始化一个空PGresult对象.它被输出是因为一些应用需要自行生成结果对象(尤其是特定的带有错误状态的对象).如果conn非空(NULL)并且状态指示一个错误,联接当前的错误信息被拷贝到PGresult.注意最终对该对象要调用PQclear,正如libpq本身返回的PGresult一样.

1.3.

2. 为包含在 SQL 查询中逃逸字串

PQescapeString 为在 SQL 查询中使用逃逸一个字串.

size_t PQescapeString (char *to, const char *from, size_t length);

如果你需要在查询字串中包含一个从不可靠的源头接收的字串 (比如,它们是随机用户输入的),那么,出于安全原因,你不能把它们直接包含在 SQL 查询里.你应该把特殊字符引起来,否则它们就会被 SQL 分析器代换.

PQescapeString 执行这个操作.from 指向将要逃逸的字串的第一个字符,length 参数计算在这个字串里的字符数量(字串结尾的字节零不是必须的,也不计入长度). to 应该指向一个缓冲区,这个缓冲区至少能保存 length 数值的两倍还多一个的字符,否则该函数行为将不可预测.调用 PQescapeString 就会把逃逸的 from 字串转换到 to 缓冲区,把特殊字符替换掉以免发生意外,并且追加终止的字节零.那些必须包围在PostgreSQL 字串文本周围的单引号不算结果字串的一部分.

PQescapeString 返回写到 to 里面的字符数目,不包括结尾的字节零.如果 to 和 from 字串相互重叠,那么其行为不可预测.

1.3.3. 逃逸包含在 SQL 查询中的二进制字串

PQescapeBytea 逃逸那些在 SQL 查询中使用二进制字串(bytea 类型).

unsigned char *PQescapeBytea(const unsigned char *from,

size_t from_length,

size_t *to_length);

在 SQL 语句中用做 BYTEA 字串文本的一部分的时候,有些 ASCII 字符必需被逃逸 (但是对于所有字符而言是可以逃逸).通常,要逃逸一个字符,它是被转换成一个三位八进制数字,该数字数值等于相应的十进制 ASCII 数值,然后前缀两个反斜扛.单引号(')和反斜扛字符()有自己特殊的逃逸序列.参阅用户手册获取更多信息. PQescapeBytea 执行这个操作,它只逃逸需要逃逸的最少的字符.

from 参数指向需要逃逸的字串的第一个字符, from_length 参数反映在这个二进制字串 (那种字节零既不必要也不计算在内的字串)里字符的个数. to_length 参数应该是一个指向某个缓冲区的指针,它的空间应该能够保存逃逸后的结果字串长度. 结果字串长度不包括结果结尾的字节零.

PQescapeBytea 返回一个 from 参数的二进制字串的逃逸后的版本,返回给调用者提供的缓冲区.返回的字串已经把所有特殊的字符替换调了,这样他们就可以由 PostgreSQL的字串文本分析器以及 bytea 的输

入函数正确地处理.同时还追加了一个结尾的字节零.那些必需包围在 PostgreSQL字串文本周围的单引号不算结果字串的一部分.

PQunescapeBytea 把一个二进制数据的逃逸后的字串表现形式转换成二进制数据 - PQescapeBytea 的反作用.

unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);

from 参数指向一个逃逸后的字串,比如 PQgetvalue 从一个 BYTEA 字段返回的.PQunescapeBytea 把它的字串表现形式转换成二进制形式,填充到一个缓冲区.它返回一个指向该缓冲区的指针,若为 NULL 则出错,缓冲区的尺寸放在 to_length 里.该指针随后可以用做 free(3) 的参数.

1.3.4. 检索 SELECT 的结果信息

*

PQntuples 返回查询结果里的元组(元组)个数.

int PQntuples(const PGresult *res);

*

PQnfields 返回查询结果里每个元组的数据域(字段)的个数.

int PQnfields(const PGresult *res);

*

PQfname 返回与给出的数据域编号相关联的数据域(字段)的名称.数据域编号从 0 开始

char *PQfname(const PGresult *res,

int field_index);

*

PQfnumber 返回与给出的数据域名称相关联的数据域(字段)的编号.

int PQfnumber(const PGresult *res,

const char *field_name);

如果给出的名字不匹配任何域,返回-1.

*

PQftype 返回与给定数据域编号关联的数据域类型.整数返回值是一个该类型的内部编码.数据域编号从0 开始.

Oid PQftype(const PGresult *res,

int field_index);

你可以查询系统表 pg_type 以获取各种数据类型的名称和属性。内建的数据类型的 OID 在源码树的

src/include/catalog/pg_type.h 文件里定义。

*

PQfmod 返回与给定数据域编号相关联的类型相关的修正数据(??).数据域编号从 0 开始.

int PQfmod(const PGresult *res,

int field_index);

*

PQfsize 返回一个PGresult 里面的一条元组的单独的一个数据域(字段)的值.元组和数据域编号从0 开始.

int PQfsize(const PGresult *res,

int field_index);

PQfsize返回在数据库元组里面给该数据域分配的空间,换句话说就是该数据类型在服务器里的二进制形式的大小(尺寸).如果该数据域是可变尺寸,返回 -1.

*

PQbinaryTuples 如果PGresult包含二进制元组数据时返回 1,如果包含 ASCII 数据返回 0.

int PQbinaryTuples(const PGresult *res);

目前,二进制元组数据只能从一个二进制游标里抽取数据的查询返回.

1.3.5. 检索 SELECT 结果数值

*

PQgetvalue 返回一个PGresult 里面一个元组单独的一个数据域(字段)的值.元组和数据域编号从 0 开始.

char* PQgetvalue(const PGresult *res,

int tup_num,

int field_num);

对大多数查询而言, PQgetvalue 返回的值是一个表示字段值的空(NULL)结尾的字符串.但是如果PQbinaryTuples() 为 1, PQgetvalue 返回的值就是该类型在后端服务器内部的二进制表现形式(但是不包括尺寸字--如果数据域是变长的).这样,把数据转换成对应的 C 类型就是程序员的责任

了. PQgetvalue 返回的指针指向一个本身是 PGresult结构的一部分的存储区域.我们不能更改它,并且如果我们要在PGresult结构的生存期后还要使用它的话,我们必须明确地把该数值拷贝到其他存储器中.

*

PQgetisnull 测试一个数据域是否为空(NULL).元组和数据域编号从 0 开始.

int PQgetisnull(const PGresult *res,

int tup_num,

int field_num);

如果该域包含 NULL,函数返回 1,如果包含非空(non-null )值,返回 0.(注意,对一个 NULL 数据域,PQgetvalue 将返回一个空字符串,不是一个空指针.)

*

PQgetlength 返回以字节计的数据域(字段)的长度.元组和数据域编号从 0 开始.

int PQgetlength(const PGresult *res,

int tup_num,

int field_num);

这是某一特定数据值的实际数据长度,也就是由PQgetvalue 指向的对象的尺寸.注意,对于 ASCII 表示的数值,这个尺寸与PQfsize 报告的二进制尺寸无关.

*

PQprint 向指定的输出流打印所有的元组和(可选的)字段名称.

void PQprint(FILE* fout, /* output stream */

const PGresult *res,

const PQprintOpt *po);

struct {

pqbool header; /* print output field headings and row count */

pqbool align; /* fill align the fields */

pqbool standard; /* old brain dead format */

pqbool html3; /* output html tables */

pqbool expanded; /* expand tables */

pqbool pager; /* use pager for output if needed */

char *fieldSep; /* field separator */

char *tableOpt; /* insert to HTML table ... */

char *caption; /* HTML caption */

char **fieldName; /* null terminated array of replacement field names */

} PQprintOpt;

这个函数以前被 psql 用于打印查询结果,但是现在已经不用这个函数了,并且此函数不再有活跃的支持。

1.3.6. 检索非-SELECT 结果信息

*

PQcmdStatus 返回产生PGresult的 SQL 命令的命令状态字符串.

char * PQcmdStatus(PGresult *res);

*

PQcmdTuples 返回被 SQL 命令影响的行的数量.

char * PQcmdTuples(PGresult *res);

如果产生PGresult的SQL 命令是 INSERT, UPDATE 或 DELETE,这里返回涉及行的行数.如果是其他命令返回一个空字符串.

*

PQoidValue 返回一个插入的元组的对象标识(OID)——如果 SQL 命令是 INSERT.否则,返回 InvalidOid.Oid PQoidValue(const PGresult *res);

如果你包含了 libpq头文件,那么 Oid 和常量 InvalidOid 的类型将被定义。他们都是某种整型类型。*

PQoidStatus 返回一个被插入的元组的对象标识的字串,如果 SQL 命令是 INSERT。否则. 返回一个空字串。

char * PQoidStatus(const PGresult *res);

因为有了 PQoidValue ,我们不建议使用这个函数,而且它在线程里使用也是不安全的

PostgreSQL数据库学习手册之libpq-C库---异步查询处理(转)[@more@]

1.4. 异步查询处理

PQexec 函数对简单的同步应用里提交命令已经是足够用的了.但是它却有几个主要的缺陷:

*

PQexec 等待命令结束.应用可能有其他工作要做(例如维护用户界面),这时它可不希望阻塞在这里等待返回.

*

因为控制是藏在 PQexec内部,前端很难取消掉正进行着的命令.(可以通过信号控制器进行,但没有别的方法.)

*

PQexec 只能返回一个PGresult结构.如果提交的命令字符串包含多个 SQL 命令,除了最后一个PGresult 以外都会被 PQexec 丢弃。

不想受到这些限制的应用可以改用下面的函数,这些函数也是构造 PQexec 的函数: PQsendQuery 和PQgetResult。

使用这些(异步)功能以及 PQputline 和 PQputnbytes 的老一些的程序可能在等待数据发送给后端时阻塞住,为解决这样的问题,增加了函数 PQsetnonblocking.

旧应用可以忽略 PQsetnonblocking 的使用,维持原有的阻塞特征。新的程序可以利用 PQsetnonblocking 获得与后端完全非阻塞的联接。

*

PQsetnonblocking 把该联接的状态设置为非阻塞。

int PQsetnonblocking(PGconn *conn, int arg)

如果arg为 TRUE,把联接状态设置为非阻塞,如果arg为 FALSE,把联接状态设置为阻塞.如果 OK 返回 0,如果错误返回 -1.此函数将确保对

在非阻塞状态,调用 PQputline,PQputnbytes, PQsendQuery 和 PQendcopy 的时候不被阻塞,而是如果需要再次它们时将是返回一个错误(而不是阻塞)。

当把一个数据库的联接设置为非阻塞的模式并且调用了 PQexec,它将暂时把联接状态设置为阻塞模式直到PQexec 完成。

在不久的将来将有更多的libpq会设计成在 PQsetnonblocking 方式下是安全的。

*

PQisnonblocking 返回数据库联接的阻塞状态。

int PQisnonblocking(const PGconn *conn)

如果联接设置为非阻塞状态,返回 1,如果是阻塞状态返回 0。

*

PQsendQuery 向服务器提交一个命令而不等待结果.如果查询成功发送则返回 1,否则返回 0.此时,可以用PQerrorMessage 获取关于失败的信息).

int PQsendQuery(PGconn *conn,

const char *query);

在成功调用 PQsendQuery后,调用 PQgetResult 一次或者多次获取结果.可以不再调用PQsendQuery (在同一次联接里)直到 PQgetResult 返回 NULL,表明命令完成.

*

PQgetResult 等待从前面 PQsendQuery 调用返回的下一个结果,然后返回之.当查询结束并且没有更多结果后返回 NULL.

PGresult *PQgetResult(PGconn *conn);

必须重复的调用 PQgetResult ,直到它返回 NULL,表明该命令结束.(如果在没有活跃的命令时调用,PQgetResult 将只是立即返回 NULL.)每个 PQgetResult 返回的非 NULL 结果都应该用前面描述的PGresult 访问函数进行分析.不要忘了在结束分析后用 PQclear 释放每个结果对象.注意,PQgetResult 只是在有查询激活而且必须的返回数据还没有被 PQconsumeInput 读取时阻塞.

使用 PQsendQuery 和 PQgetResult 解决了 PQexec的一个问题:如果一个命令字符串包含多个 SQL 命令,这些命令的结果可以独立的获得.(顺便说一句:这样就允许一种简单的重叠处理模式,前端可以处理一个查询的结果而后端可以仍然在处理同一命令字符串的后面的查询.)但是,调用 PQgetResult 将仍然导致前端被阻塞住直到后端完成下一个 SQL 命令.这一点可以通过合理的使用下面三个函数来避免:

*

PQconsumeInput 如果存在后端来的输入可用,则使用之.

int PQconsumeInput(PGconn *conn);

PQconsumeInput 通常返回 1 表明"没有错误",而返回 0 表明有某种错误发生, (同时设置PQerrorMessage).注意这个结果并不表明实际上是否收集了数据.在调用 PQconsumeInput之后,应用可以检查 PQisBusy 和/或 PQnotifies 看一眼它们的状态是否改变.

PQconsumeInput 可以在应用还没有做好处理结果或通知的情况下被调用.这个过程将读取可用的数据并且在一个缓冲区里保存它,这样导致一个 select() 读准备好标识的生成.这样应用就可以使用PQconsumeInput 立即清掉 select() 条件,然后在空闲的时候检查结果.

*

PQisBusy 在查询忙的时候返回 1 ,也就是说, PQgetResult 将阻塞住等待输入.一个 0 的返回表明这时调用 PQgetResult 可以确保不阻塞.

int PQisBusy(PGconn *conn);

PQisBusy 本身将不会试图从后端读取数据;所以必须先调用 PQconsumeInput ,否则忙状态将永远不会消除.

*

PQflush 试图把任何正在排队的数据冲刷到后端,如果成功(或者发送队列为空)返回 0,如果因某种原因失败返回EOF。

int PQflush(PGconn *conn);

在一个非阻塞的联接调用 select() 判断是否有响应到达之前需要调用一个 PQflush 。如果返回 0 则保证了与后端的发送队列里面没有待发送的数据。只有使用了 PQsetnonblocking 的应用需要这个。

*

PQsocket 获取用于后端联接套接字的文件描述符号.一个有效的描述符应该是 >= 0;一个 -1 表明当前没有打开与后端的联接.

int PQsocket(const PGconn *conn);

PQsocket 应该用于获取准备调用 select() 的后端套接字描述符.这就允许一个应用使用阻塞的联接等待后端的响应或者其他条件.如果 select() 的结果表明可以从后端套接字读取数据,那么应该调用PQconsumeInput 读取数据;之后,,PQisBusy,PQgetResult,和/或 PQnotifies 可用于处理返回信息.非阻塞的联接(那些使用了 PQsetnonblocking的联接)在 PQflush 返回 0 之前,(这表明没有数据缓冲着等待发送给后端)不应该使用 select()。

一个使用这些函数的典型的前端将有一个主循环使用 select() 等待所有它必须处理的条件.其中一个条件将会是后端来的数据已准备好,从 select() 的角度来看就是 PQsocket 标识的文件描述符上已经有可读取的数据.当主循环侦测到输入准备好,它将调用PQconsumeInput 读取输入.然后可以调用 PQisBusy 返回 false (0)后面可以跟着 PQgetResult。同样它(用户应用)可以调用 PQnotifies测 NOTIFY 信息(参阅下面的 "异步通知").例子程序节里面给出了一个例子程序.

一个使用 PQsendQuery/PQgetResult 的前端同样也可以试图取消一个正在被后端处理的命令.

*

PQrequestCancel 要求 PostgreSQL 放弃处理当前命令.

int PQrequestCancel(PGconn *conn);

如果取消的请求成功发送,返回值是 1,否则是 0.(如果为假,PQerrorMessage 会告之为什么.)不过,取消请求的成功发送将不保证请求将产生作用.不管 PQrequestCancel 的返回值是什么,应用都必须继续使用 PQgetResult进行通常的后续的结果读取工作.如果取消动作生效,当前的命令将提前退出并返回一个错误结果.如果取消动作失败(也就是后端已经处理完命令了),那么将没有可见的结果.

注意:如果当前的命令是事务的一部分,取消动作将退出整个事务.

PQrequestCancel 可以很安全地从一个信号句柄里调用.所以,如果取消动作可以从信号句柄里发出的话,它也可以与简单的 PQexec一起使用.例如, psql 从一个SIGINT信号句柄里调用 PQrequestCancel ,因此允许交互地取消通过 PQexec 发出的查询.注意,如果没有与后端建立联接或者后端当前没有处理命令, PQrequestCancel 将不发生做用

PostgreSQL数据库手册之libpq-C库-----捷径接口(转)[@more@]

1.5. 捷径接口

PostgreSQL 提供一个发往后端的函数调用的捷径接口.这是一个通向系统内部的后门,因而可能存在安全漏洞.大多数用户应该不需要这个特性.

*

PQfn 请求允许通过捷径接口执行后端函数.

PGresult* PQfn(PGconn* conn,

int fnid,

int *result_buf,

int *result_len,

int result_is_int,

const PQArgBlock *args,

int nargs);

fnid参数是待执行的函数的对象标识(OID). result_buf是放置返回值的缓冲区.调用者必须为返回值分配足够的空间(这里没有检查!).实际的返回值长度将被放在result_len指向的整数里返回.如果预期返回值是 4-字节整数,把result_is_int设为 1;否则设为 0.(把result_is_int设为 1 告诉libpq必要时交换数值字节序,这样就可以正确地传输成客户机上的整数值.当 result_is_int是 0 时,后端发送回来的字节串不做修改.) args和nargs声明要传入函数的参数.

typedef struct {

int len;

int isint;

union {

int *ptr;

int integer;

} u;

} PQArgBlock;

PQfn 总是返回一个有效的PGresult*.在使用结果之前应该检查结果状态。当结果不再使用后,调用者有义务使用 PQclear 释放PGresult

PostgreSQL数据库学习手册之libpq-C---库异步通知(转)[@more@]

1.6. 异步通知

PostgreSQL 支持通过LISTEN和NOTIFY命令产生的异步通知.一个后端用LISTEN命令注册一个它感兴趣的通知条件(也可以用UNLISTEN去掉这个注册).所有正在监听某一通知条件的后端在该条件名的 NOTIFY (通知)被任何后端执行后都将被异步地通知.通知发出者不会传递附加的信息到监听者.因此,很典型地是,任何实际的需要被传递的数据都是通过一个数据库关系传递的.通常,条件名与相关联的关系同名,但是并不是一定要与某个关系相关才行.

libpq 应用把LISTEN和 UNLISTEN 命令作为通常的 SQL 命令提交.因此,通过调用PQnotifies()可以侦测到 NOTIFY 消息的到达.

*

PQnotifies 从一个来自后端的未处理的通知信息列表中返回下一条通知.如果没有未处理的信息则返回NULL.一旦PQnotifies返回一条通知,该通知会被认为已处理并且将被从通知列表中删除.

PGnotify* PQnotifies(PGconn *conn);

typedef struct pgNotify {

char *relname; /* 包含数据的关系(表)名字*/

int be_pid; /* 后端进程 id*/

} PGnotify;

在处理完 PQnotifies 返回的PGnotify对象后,别忘了用 free() 把它释放,以避免内存泄漏。

注意: 在 PostgreSQL 6.4 和更高的版本里, be_pid 是正在通知的后端的 PID,而在早些的版本里它总是你自己的后端的 PID。

第二个样本程序给出一个使用异步通知的例子.

PQnotifies() 实际上并不读取后端数据;它只是返回被前面的另一个libpq函数吸收的信息.在以前的libpq的版本里,周期性的收到通知(NOTIFY)信息的唯一方法是持续的提交查询,即使是空查询也可以,并且在每次 PQexec()后检查 PQnotifies() 。现在这个方法也能还工作,不过我们认为它太浪费处理器时间而废弃了它。

在你没有可用的查询提交时检查 NOTIFY 消息的更好的方法是调用 PQconsumeInput(),然后检查PQnotifies().你可以使用 select() 来等待后端数据的到达,这样在没有数据可处理时可以不浪费 CPU 时间.(参阅 PQsocket() 获取用于 select() 的文件描述符.)注意这种方法不管你使用

PQsendQuery/PQgetResult 还是简单的 PQexec来执行查询都能工作.不过,你应该记住在每次PQgetResult 或 PQexec后检查 PQnotifies() ,看看在处理查询的过程中是否有通知到达

1.7. 与 COPY 命令相关的函数

PostgreSQL 里的 COPY 命令里有用于 libpq 里从网络联接读出或者写入的选项.因此,这些函数有必要直接访问网络联接,以便应用可以充分利用这个功能.

这些函数应该只在从 PQexec 或 PQgetResult 获得了 PGRES_COPY_OUT 或 PGRES_COPY_IN 结果对象的情况下执行.

*

PQgetline 读取一个以回车符(换行符)结尾的字符行中指定字节数的字符(由后端服务器传输)到一个字符串缓冲区.

int PQgetline(PGconn *conn,

char *string,

int length)

类似 fgets,这个过程拷贝最多 length-1 个字符到字符串里.但是它会象 gets那样把结尾的换行符转换成一个字节零. PQgetline 在输入结束时返回 EOF ,如果整行都被读取了返回 0,如果缓冲区填满了而还没有遇到结束的换行符则返回 1.

注意,应用程序必须检查新行是否包含两个字符 ".",这表明后端服务器已经完成了 copy 命令的结果集的发送.如果应用可能收到超过 length-1 字符长的字符,我们就应该确保正确识别"."行(例如,不要把一个长的行的结束当作一个终止行). src/bin/psql/copy.c 里的代码包含正确控制 copy 协议的过程.*

PQgetlineAsync 不做阻塞地读取一行以换行符结尾的字符(由后端服务器传输)到一个缓冲区中.

int PQgetlineAsync(PGconn *conn,

char *buffer,

int bufsize)

这个过程类似于 PQgetline,但是可以用于那些必须异步地读取 COPY 数据的应用,因而是不阻塞的.在使用了 COPY 命令和获取了 PGRES_COPY_OUT响应之后,应用应该调用 PQconsumeInput 和PQgetlineAsync 直到收到数据结束的信号.不象PQgetline,这个过程负责检测数据结束.在每次调用时,如果libpq 的输入缓冲区内有可用的一个完整的换行符结尾的数据行或者调用者声明的缓冲区小于到来的数据行的长度, PQgetlineAsync 都将返回数据.否则,在其他数据到达之前不会返回数据.

如果见到了拷贝数据结束的信号,此过程返回 -1,如果没有可用数据返回 0,或者是给出一个正数表明返回的数据的字节数.如果返回 -1,调用者下一步必须调用 PQendcopy,然后回到正常处理.返回的数据将不会超出换行符的范围.如果可能,每次将返回一个完整行.但如果调用者提供的缓冲区太小,无法容下后端发出的整行,那么将返回部分行.这个可以通过测试返回的最后一个字节是否 " " 来确认.返回的字符串不是空结尾的.(如果你想得到一个空结尾的字串,确保你传递了一个 bufsize 比实际大小少一字节的缓冲区.)

*

PQputline 向后端服务器发送一个空结尾的字符串.成功时返回 0,如果不能发送字符串返回 EOF.

int PQputline(PGconn *conn,

const char *string);

注意,应用在最后一行时必须明确的发送两个字符 "." ,通知后端它已经完成数据发送.

*

PQputnbytes 向后端服务器发送一个非空结尾的字符串.成功时返回 0,如果不能发送字符串返回 EOF.int PQputnbytes(PGconn *conn,

const char *buffer,

int nbytes);

此函数类似 PQputline ,除了数据缓冲区不需要是空结尾的之外,因为要发送的字节数是直接声明的.

*

PQendcopy 与后端同步.这个函数等到后端完成拷贝(才返回?).你可以在用 PQputline 向后端发送完最后一个字符串后或者用 PGgetline从后端获取最后一行字符串后调用它.我们必须调用这个函数,否则后端可能会和前端"同步丢失"。在这个函数返回后,后端就已经准备好接收下一个 SQL 命令了.成功时返回0,否则返回非零值.

int PQendcopy(PGconn *conn);

一个例子:

PQexec(conn, "CREATE TABLE foo (a int4, b char(16), d double precision)");

PQexec(conn, "COPY foo FROM STDIN");

PQputline(conn, "3 hello world 4.5 ");

PQputline(conn,"4 goodbye world 7.11 ");

...

PQputline(conn,". ");

PQendcopy(conn);

在使用 PQgetResult时,应用应该对 PGRES_COPY_OUT 的结果做出反应:重复调用 PQgetline ,并且在收到结束行时调用 PQendcopy.然后应该返回到 PQgetResult 循环直到 PQgetResult 返回 NULL.类似地,PGRES_COPY_IN 结果是用一系列 PQputline 调用最后跟着 PQendcopy,然后返回到 PQgetResult 循环.这样的排列将保证嵌入到一系列 SQL 命令里的 copy in 或 copy out 命令将被正确执行.

旧的应用大多通过 PQexec 提交一个 copy in 或 copy out 命令并且假设在 PQendcopy 后事务完成.这样只有在copy in/out 是命令字串里的唯一的 SQL 命令时才能正确工作

1.8. libpq 跟踪函数

*

PQtrace 打开对前端/后端通讯的跟踪,把调试信息输出到一个文件流里.

void PQtrace(PGconn *conn

FILE *debug_port)

*

PQuntrace 关闭PQtrace打开的跟踪

void PQuntrace(PGconn *conn)

1.9. libpq 控制函数

*

PQsetNoticeProcessor 控制libpq生成的通知和警告信息的汇报.

typedef void (*PQnoticeProcessor) (void *arg, const char *message);

PQnoticeProcessor

PQsetNoticeProcessor(PGconn *conn,

PQnoticeProcessor proc,

void *arg);

缺省时,libpq 在后端往 stderr 上打印“通知”信息和一些它自身生成的错误信息.这个特性可以通过提供一个对信息进行某种加工的回叫函数来更改.我们向这个回叫函数传递错误信息的文本(包括文本结尾的换行符),和一个空(void)指针,该指针与传递给 PQsetNoticeProcessor 的完全一样.(如果需要,这个指针可以用于访问应用相关的状态.)缺省的通知处理器只是简单的

static void

defaultNoticeProcessor(void * arg, const char * message)

{

fprintf(stderr, "%s", message);

}

要使用特殊的通知处理器,在创建完新的PGconn对象后马上调用 PQsetNoticeProcessor。

返回值是指向以前的通知处理器的指针。如果你提供了一个 NULL 做为回调指针,那么不会发生任何动作,只是返回当前的指针。

一旦你设置了一个通知处理器,你就应该预料到该函数可能在PGconn对象或 PGresult对象从开始存在时起就可能被调用.当创建一个PGresult时,PGconn 的当前的通知指针被拷贝到 PGresult里提供给可能需要的过程,如 PQgetvalue 使用.

1.10. 环境变量

下面的环境变量可以用于选择缺省的联接参数值,这些值将被 PQconnectdb 或 PQsetdbLogin 使用--如果调用代码没有直接声明相应值的话.这些(环境变量)可以避免把麻烦的数据库名强加入简单的应用程序的硬代码里面.

*

PGHOST 设置缺省的服务器名.如果它以一个斜扛开头,那么它声明一个 Unix 域套接字而不是 TCP/IP 通讯;其值就是该套接字文件存储的目录(缺省为 /tmp).

*

PGPORT 设置缺省的 TCP 端口号或者设置与 PostgreSQL 的 Unix 域套接字的文件扩展(文件标识符).*

PGDATABASE 设置缺省的 PostgreSQL 数据库名.

*

PGUSER 设置用于与数据库联接和用于认证的用户名.

*

PGPASSWORD 如果后端要求口令认证,设置使用的口令.因为安全原因,这个功能已经废弃了;请考虑使用$HOME/.pgpass文件。

*

PGREALM 设置与 PostgreSQL一起使用的 Kerberos 领域--如果该域与本地域不同的话。如果设置了PGREALM ,PostgreSQL 应用将试图用这个域(realm)与服务器进行认证并且使用独立的门票文件(ticket files)以避免与本地的门票文件冲突.只有在后端选择了 Kerberos 认证时才使用这个环境变量.(译注:门票文件是 Kerberos认证协议中用于交换密钥的一个文件/服务器。)

*

PGOPTIONS 为 PostgreSQL 后端设置附加的运行时选项.

*

PGTTY 设置后端调试信息显示输出的文件或者控制台(tty).

下面的环境变量可以用于为每个PostgreSQL 会话声明用户级别的缺省特性:

*

PGDATESTYLE 设置缺省的日期/时间表现形式.

*

PGTZ 设置缺省的时区.

*

PGCLIENTENCODING 设置缺省的客户端编码(如果配制PostgreSQL 时选择了多字节支持).

下面的环境变量可以用于为每个PostgreSQL 会话声明缺省的内部特性:

*

PGGEQO 为基因优化器设置缺省模式.

参阅 SET SQL 命令获取这些环境变量的正确值的信息.

1.11. 文件

> 家目录中的.pgpass 是一个可以包含口令的文件。如果连接要求口令,那么可以用它。这个文件的格式应该是:

hostname:port:database:username:password

这些行可以是一个文本名字,或者 *,它匹配所有的东西。第一个匹配的东西将得以使用,因此我们应该把最具体的记录放在前面。有 : 或者的记录应该用逃逸。

.pgpass 的权限必须不允许任何全局或者同组的用户访问;我们可以用命令 chmod 0600 .pgaccess 实现这个目的。如果权限比这个松,这个文件将被忽略。

1.1

2. 线程特性

到 PostgreSQL 7.0 时 libpq 是线程安全的, --只要不是两个线程试图同时操作同一个PGconn对象.实际上,你无法从不同的线程向同一个联接对象发出并发的查询.(如果你需要运行并行查询,请启动多个联接.)

PGresult对象在创建后是只读的,因此可以自由地在线程之间传递.

过时了的函数 PQoidStatus 和 fe_setauthsvc 都是线程不安全的,因此不应该在一个多线程的程序里面使用. PQoidStatus 可以由 PQoidValue代替.而我们觉得根本没有调用 fe_setauthsvc 的必要.

Libpq 客户端使用的 crypt 加密方法倚赖 crypt() 系统函数,它通常不是线程安全的.我们最好使用 MD5 加密,它在所有平台上是线程安全的.

1.13. 制作 Libpq 程序

要制作(也就是说编译和链接)你的 libpq 程序,你需要做下面的一些事情∶

*

包含 libpq-fe.h 头文件∶

#include

如果你没干这件事,那么你通常会看到类似下面这样的来自编译器的信息∶

foo.c: In function `main':

foo.c:34: `PGconn' undeclared (first use in this function)

foo.c:35: `PGresult' undeclared (first use in this function)

foo.c:54: `CONNECTION_BAD' undeclared (first use in this function)

foo.c:68: `PGRES_COMMAND_OK' undeclared (first use in this function)

foo.c:95: `PGRES_TUPLES_OK' undeclared (first use in this function)

*

告诉你的编译器PostgreSQL头文件的安装位置,方法是给你的编译器提供 -Idirectory 选项. (有些时候编译器会查找缺省的目录,因此你可以忽略这些选项.) 比如,你的命令行看起来象∶

cc -c -I/usr/local/pgsql/include testprog.c

如果你在使用制作文件(makefile),那么向 CPPFLAGS 变量中增加下面的选项∶

CPPFLAGS += -I/usr/local/pgsql/include

如果你的程序可能会被别人编译,那么你应该避免象上面那样把目录路径写成硬编码.取而代之的是你可以运行 pg_config 工具找出头文件在系统的什么地方∶

$ pg_config --includedir

/usr/local/include

如果没能给编译器提供正确的选项将产生类似下面这样的错误信息

testlibpq.c:8:22: libpq-fe.h: No such file or directory

*

在链接最后的程序的时候,声明选项 -lpq,这样就可以把 libpq 库链接进来,还要声明 -Ldirectory 以指向 libpq 所处的目录. (同样,编译器也会搜索一些缺省的目录.) 为了尽可能提高可移植性,你应该把 -L 选项放在 -lpq 选项前面.比如∶

cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq

你也可以用 pg_config 找出库目录∶

$ pg_config --libdir

/usr/local/pgsql/lib

指向这类问题的错误信息会是类似下面这个样子.

testlibpq.o: In function `main':

testlibpq.o(.text+0x60): undefined reference to `PQsetdbLogin'

testlibpq.o(.text+0x71): undefined reference to `PQstatus'

testlibpq.o(.text+0xa4): undefined reference to `PQerrorMessage'

这意味着你忘记 -lpq 了.

/usr/bin/ld: cannot find -lpq

这意味着你忘记这-L 或者没有声明正确的路径.

如果你的代码引用了头文件 libpq-int.h,而且你不原意修补你的代码以避免使用它,那么从PostgreSQL7.2 开始,该文件将在 includedir/postgresql/internal/libpq-int.h 里出现,因此你需要给你的编译器命令行增加合适的 -I 选项.

1.14. 例子程序

Example 1-1. libpq 例子程序 1

[myphp]

/*

* testlibpq.c

*

* Test the C version of libpq, thePostgreSQLfrontend

* library.

* 测试 PostgreSQL 前端库 libpq 的 C 版本

*/

#include

#include

void

exit_nicely(PGconn *conn)

{

PQfinish(conn);

exit(1);

}

main()

{

char *pghost,

*pgport,

*pgoptions,

*pgtty;

char *dbName;

int nFields;

int i,

j;

/* FILE *debug; */

PGconn *conn;

PGresult *res;

/*

* begin, by setting the parameters for a backend connection if the * parameters are null, then the system will try to use reasonable * defaults by looking up environment variables or, failing that, * using hardwired constants

*/

pghost = NULL; /* host name of the backend server */

pgport = NULL; /* port of the backend server */

pgoptions = NULL; /* special options to start up the backend

* server */

pgtty = NULL; /* debugging tty for the backend server */

dbName = "template1";

/* make a connection to the database */

conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

/*

* check to see that the backend connection was successfully made */

if (PQstatus(conn) == CONNECTION_BAD)

{

fprintf(stderr, "Connection to database '%s' failed. ", dbName); fprintf(stderr, "%s", PQerrorMessage(conn));

exit_nicely(conn);

}

/* debug = fopen("/tmp/trace.out","w"); */

/* PQtrace(conn, debug); */

/* start a transaction block */

res = PQexec(conn, "BEGIN");

if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

{

fprintf(stderr, "BEGIN command failed ");

PQclear(res);

exit_nicely(conn);

}

/*

* should PQclear PGresult whenever it is no longer needed to avoid * memory leaks

*/

PQclear(res);

/*

PostgreSQL安装和简单使用

PostgreSQL安装和简单使用 PostgreSQL安装和简单使用 作者:小P 来自:https://www.wendangku.net/doc/9d1480271.html, 摘要:PostgreSQL是现在比较流行的数据库之一,这个起源于伯克利(BSD)的数据库研究计划目前已经衍生成一项国际开发项目,并且有非常广泛的用户。据我了解国内四大国产数据库,其中三个都是基于PostgreSQL开发的。并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发PostgreSQL,不管是私用,商用,还是学术研究使用。本文只是简单介绍一下postgresql的安装和简单的使用,语法方面涉及的比较少,以方便新手上路为目的。目录1.系统环境及安装方法;1.1 系统环境; 1.2 安装; 2.启动PostgreSQL 数据库服务器;2.1 在流行Linux发行版的启动方法; 2.2 关于PostgreSQL启动和存储目录; 3.创建用户;3.1 添加用户; 3.1.1 不带参数的创建用户; 3.1.2 为指定的主机和端口上创建用户; 3.1.3创建超级用户; 3.2 删除用户:3.2.1 删除本地的Postgres用户;

3.2.2 删除远程Postgres服务器上的用户; 4. 创建和删除数据库;4.1创建数据库 4.2 删除数据库 5.访问数据库5.1 激活数据库 5.2 帮助和退出数据库 6. Postgresql图形化管理工具pgAdmin3 ;6.1 安装;6.1.1 Ubuntu安装; 6.1.2 其它系统的安装;6.2 pgAdmin3的简单使用;6.2.1 pgAdmin3的启动; 6.2.2 连接已创建的数据库mydb ; 7. 创建和删除表;7.1 创建新表; 7.2 数据类型; 7.3 删除表;8. 向表中添加行;8.1 INSERT; 8.2 point类型输入; 8.3 COPY;9. 查询一个表;9.1 SELECT; 9.2 WHERE; 9.3 排序;10. 视图; 11. 更新行; 12. 删除行; 13. 关于本文; 14. 更新日志; 15. 参考文档; 16. 相关文档; +++++++++++++++++++++++++++++++++++++++++++

监视并记录Apache网站服务器的运行

监视并记录Apache网站服务器的运行 LogFormat 指令承诺你告诉Apache你想要记录要求的哪些方面。而你仍需附加的指令来告诉Apache在哪里记录那些信息,这在下一章中将会介绍。下面的例子显示了两种最受欢迎的格式的配置:一般日志格式和整合日志格式。当Apache收到一个要求,他将会用相应的要求属性来替代以%为前缀的每一个域。假如您正在使用一般日志格式,您的日志文件里 尽管有附件提供日志格式的详尽索引,下表描述了一些最为重要的域: # %h: 客户端(例如,扫瞄器)向服务器发出连接要求时自己的当时的IP地址或域名(需开启HostNameLookups)。 # %u: 使用方式认证用户时,记录下的用户的编号。 # %t: 服务器同意到连接要求的时刻。 # %r: 客户端发出的原始连接要求中的文本信息,包含所使用的方法。 # %>s: 服务器应答扫瞄器后的返回状态代码,200表示要求成功。. # %b: 服务器应答扫瞄器发出的单个要求的回传对象的内容大小(字节为单位),不统计数据包头部字节。 整合日志格式在一般日志格式的基础上扩展出了两个附加的域。定义为: # %{Referer}i: 连接要求数据包包头,包含指向当前页面的文档关联信息。 # %{User-agent}i: 用户代理连接要求数据包包头,包含客户扫瞄器的信息。 创建一个自定义日志文件 您可能会想创建Apache自带以外的新的日志文件。下面的例子将运用CustomLog来创建一个新的日志文件,并储存由一个之前定义好的日志格式,即前一章提到的common,所定义的信息。您还能够用格式本身的定义来替换昵称。一个附加的,更为简单的指令是Transferlog,它只同意最后一个LogFormat指令提供的定义。

OB开发手册中文版

OB开发手册中文版

Contents [hide]1 简介 ? 1 简介 ? 1.1 开发概述 ? 1.2 开发方法 ? 1.3 组织开发工作 ? 1.4 标识符命名标准 ? 1.4.1 数据库元素 ? 1.4.2 MVC目录 ? 1.4.3 存储过程语法 ? 1.5 目录结构 ? 1.6 风格指南 ? 1.6.1 逻辑比较 ? 1.6.2 逗号分隔列表 ? 1.6.3 圆括号中的空格 ? 1.6.4 SELECT INTO和INSERT INTO ? 1.6.5 SQL关键字 ? 1.7 编译程序 ? 1.7.1 命令行编译任务 ? 1.7.2 开发环境 ? 1.7.3 生产环境 ? 1.8 从源代码构建 ? 1.8.1 安装Subversion ? 1.8.2 从Subversion中检出源代码 ? 1.8.3 快速构建指南 ? 1.9 集成开发环境 ? 2 Openbravo数据模型 ? 2.1 存储的数据库对象 ? 2.2 实体-关系(ER)图 ? 2.3 创建存储过程 ? 2.3.1 AD_PInstance和AD_PInstance_Para表 ? 2.3.2 存储过程的输入参数 ? 2.3.2.1 从AD_PInstance表中获取有用的信息 ? 2.3.2.2 AD_Update_PInstance存储过程 ? 2.3.2.3 例外和错误管理 ? 2.4 存储过程语法的建议 ? 2.4.1 通用规则 ? 2.4.1.1 游标 ? 2.4.1.2 数组 ? 2.4.1.3 ROWNUM ? 2.4.1.4 %ROWCOUNT ? 2.4.1.5 %ISOPEN,%NOTFOUND ? 2.4.2 表 ? 2.4.3 函数 ? 2.4.4 存储过程

PostgreSQL数据库使用pg_dump—psql 转储数据库

使用pg_dump/psql转储数据库 pg_dump/psql应用程序在pg安装目录的bin目录下。 只要在安装pg数据库的服务器上,且能够连通远程pg数据库,都可以实现数据导出。 一、pg_dump导出 pg_dump –h hostname –U name –p port –d database –f “file_name” -h: 数据库服务器地址 -U: 大写的U,用户名 -p: 端口号 -d: 数据库名 -f: 存储的文件路径和名称 pg_dump -h 110.84.129.40 -U postgres -p 3306 -d O2O -f "/home/wsxcde/database_file/O2O_bak_140430.dmp" 回城执行,会要求输入密码,正确,即可导出,没有进度条 远程导出300M的文件,大概时间10分钟。 以上命令是导出数据的全部对象,包括数据,对象(index,table,sequence,function等),但不包括blob的大对象,如果要导出大对象,要加上“-b”。 二、psql数据导入 psql –h localhost –U postgres –d new_db –f "xxx.dmp" -h: 数据库服务器地址,如果导入本机,直接使用localhost -U:大写的U,被导入数据库的用户名 -d: 数据库名,想导入的数据库,导入前请检查此数据库是否存在,不存在会报错 -f: 备份文件dmp的来源 psql–h localhost –U postgres –d O2O –f "/home/wsxcde/database_file/O2O_bak_140430.dmp" 300M的文件,导入时间不大约10多秒。

PostgreSQL学习手册

tgreSQL学习手册(五) 函数和操作符 阿里云携手开源中国众包平台发布百万悬赏项目? 一、逻辑操作符: 常用的逻辑操作符有:AND、OR和NOT。其语义与其它编程语言中的逻辑操作符完全相同。 二、比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符描述 <小于 >大于 <=小于或等于 >=大于或等于 =等于 !=不等于 比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,且返回boolean类型。除了比较操作符以外,我们还可以使用BETWEEN语句,如: a BETWEEN x AND y 等效于 a >= x AND a <= y a NOT BETWEEN x AND y 等效于 a < x OR a > y 三、数学函数和操作符: 下面是PostgreSQL中提供的数学操作符列表: 操作符描述例子结果 +加 2 + 35 -减 2 - 3-1 *乘 2 * 36 /除 4 / 22 %模 5 % 41 ^幂 2.0 ^ 3.08 |/平方根|/ 25.05 ||/立方根||/ 27.03 !阶乘 5 !120 !!阶乘!! 5120 @绝对值@ -5.05 &按位AND91 & 1511 |按位OR32 | 335

#按位XOR17 # 520 ~按位NOT~1-2 <<按位左移 1 << 416 >>按位右移8 >> 22 按位操作符只能用于整数类型,而其它的操作符可以用于全部数值数据类型。按位操作符还可以用于位串类型bit和bit varying, 下面是PostgreSQL中提供的数学函数列表,需要说明的是,这些函数中有许多都存在多种形式,区别只是参数类型不同。除非特别指明,任何特定形式的函数都返回和它的参数相同的数据类型。 函数返回类 型 描述例子结果 abs(x)绝对值abs(-17.4)17.4 cbrt(double)立方根cbrt(27.0)3 ceil(double/numeric)不小于参数的最小的整 数 ceil(-42.8)-42 degrees(double) 把弧度转为角度degrees(0.5)28.6478897565412 exp(double/numeric)自然指数exp(1.0) 2.71828182845905 floor(double/numeric)不大于参数的最大整数floor(-42.8)-43 ln(double/numeric)自然对数ln(2.0)0.693147180559945 log(double/numeric)10为底的对数log(100.0)2 log(b numeric,x numeric)numeric指定底数的对 数 log(2.0, 64.0) 6.0000000000 mod(y, x)取余数mod(9,4)1 pi() double"π"常量pi() 3.14159265358979 power(a double, b double)double求a的b次幂power(9.0, 3.0)729 power(a numeric, b numeric) numeric求a的b次幂power(9.0, 3.0)729 radians(double)double把角度转为弧度radians(45.0)0.785398163397448 random()double 0.0到1.0之间的随机 数值 random() round(double/numeric)圆整为最接近的整数round(42.4)42 round(v numeric, s int)numeric圆整为s位小数数字round(42.438,2)42.44 sign(double/numeric)参数的符号(-1,0,+1) sign(-8.4)-1 sqrt(double/numeric)平方根sqrt(2.0) 1.4142135623731 trunc(double/numeric)截断(向零靠近)trunc(42.8)42 trunc(v numeric, s int)numeric 截断为s小数位置的数 字 trunc(42.438,2)42.43 三角函数列表: 函数描述 acos(x)反余弦

PostgreSQL+Linux 从入门到精通培训文档 2命令

本章大纲 1. 如何访问命令行 2. 使用命令行下的工具 非编辑模式 进入编辑模式 3. 正则表达式、管道和I/O 重定向 4. 管理用户账户 5. 文件访问控制 6. 管理进程 1,如何访问命令行 1.1 本地命令行的访问 在图形界面中,访问命令行的方法:打开Terminal,Console。或者:Ctrl+Alt+F1 ~ F6 1.2 使用SSH 访问命令行 同上 2,使用命令行下的工具 2.1 使用硬链接

硬链接,指在同一个文件系统中,对inode的引用,只要文件上存在至少1个硬链接,就可以找到对应的inode。 [digoal@digoal01 ~]$ echo "abc" > ./a [digoal@digoal01 ~]$ stat a File: `a' Size: 4 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 656374 Links: 1 -- 硬链接数量 Access: (0664/-rw-rw-r--) Uid: ( 500/ digoal) Gid: ( 500/ digoal) Access: 2017-04-11 13:18:14.292848716 +0800 Modify: 2017-04-11 13:18:14.292848716 +0800 Change: 2017-04-11 13:18:14.292848716 +0800 创建硬链接 [digoal@digoal01 ~]$ ln -L ./a ./b [digoal@digoal01 ~]$ stat a File: `a' Size: 4 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 656374 Links: 2 Access: (0664/-rw-rw-r--) Uid: ( 500/ digoal) Gid: ( 500/ digoal) Access: 2017-04-11 13:18:14.292848716 +0800 Modify: 2017-04-11 13:18:14.292848716 +0800 Change: 2017-04-11 13:18:34.631855044 +0800 [digoal@digoal01 ~]$ stat b File: `b' Size: 4 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 656374 Links: 2 Access: (0664/-rw-rw-r--) Uid: ( 500/ digoal) Gid: ( 500/ digoal) Access: 2017-04-11 13:18:14.292848716 +0800 Modify: 2017-04-11 13:18:14.292848716 +0800 Change: 2017-04-11 13:18:34.631855044 +0800 删除一个硬链接,还能通过其他硬链接找到对应的inode。 [digoal@digoal01 ~]$ rm a rm: remove regular file `a'? y [digoal@digoal01 ~]$ cat b abc 2.2 归档和解压 常用的归档命令tar 归档-c (常用压缩库-j bz2, -z gzip) [digoal@digoal01 ~]$ tar -jcvf test.tar.bz2 b

PostgreSQL学习手册(PLpgSQL过程语言)

一、概述: PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随后对该表达式或SQL命令的访问都将使用该规划。如果在一个条件语句中,有部分SQL命令或表达式没有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只有在其被执行到的时候才能发现。 由于PL/pgSQL在函数里为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如: CREATE FUNCTION populate() RETURNS integer AS $$ DECLARE -- 声明段 BEGIN PERFORM my_function(); END; $$ LANGUAGE plpgsql; 在调用以上函数时,PERFORM语句的执行计划将引用my_function对象的OID。在此之后,如果你重建了my_function函数,那么populate函数将无法再找到原有my_function函数的OID。要解决该问题,可以选择重建populate函数,https://www.wendangku.net/doc/9d1480271.html,或者重新登录建立新的会话,以使PostgreSQL重新编译该函数。要想规避此类问题的发生,在重建my_function时可以使用CREATE OR REPLACE FUNCTION命令。 鉴于以上规则,在PL/pgSQL里直接出现的SQL命令必须在每次执行时均引用相同的表和字段,换句话说,不能将函数的参数用作SQL命令的表名或字段名。如果想绕开该限制,可以考虑使用PL/pgSQL 中的EXECUTE语句动态地构造命令,由此换来的代价是每次执行时都要构造一个新的命令计划。 使用PL/pgSQL函数的一个非常重要的优势是可以提高程序的执行效率,由于原有的SQL调用不得不在客户端与服务器之间反复传递数据,这样不仅增加了进程间通讯所产生的开销,而且也会大大增加网络IO的开销。 二、PL/pgSQL的结构: PL/pgSQL是一种块结构语言,函数定义的所有文本都必须在一个块内,其中块中的每个声明和每条语句都是以分号结束,如果某一子块在另外一个块内,那么该子块的END关键字后面必须以分号结束,不过对于函数体的最后一个END关键字,分号可以省略,如: [ <

PostgreSQL详解

PostgreSQL数据库 一:PostgreSQL介绍 1、PostgreSQL就是以加州大学伯克利分校计算机系开发得 POSTGRES,现在已经更名为POSTGRES,版本 4、2为基础得对象关系型数据库管理系统(ORDBMS)。PostgreSQL支持大部分 SQL标准并且提供了许多其她现代特性:复杂查询、外键、触发器、视图、事务完整性、MVCC。同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新得数据类型、函数、操作符、聚集函数、索引方法、过程语言。并且,因为许可证得灵活,任何人都可以以任何目得免费使用、修改、与分发PostgreSQL,不管就是私用、商用、还就是学术研究使用。 2、PostgreSQL图标 3.PostgreSQL优点 有目前世界上最丰富得数据类型得支持支持,其中有些数据类型可以说连商业数据库都不具备,具体类型下文会说明、 PostgreSQL拥有一支非常活跃得开发队伍,而且在许多黑客得努力下,PostgreSQL 得质量日益提高 PostgreSQL 对接口得支持也就是非常丰富得,几乎支持所有类型得数据库客户端接口。这一点也可以说就是 PostgreSQL 一大优点。 4.PostgreSQL缺点 首先,早期得 PostgreSQL 继承了几乎所有 Ingres, Postgres, Postgres95 得问题:过于学院味,因为首先它得目得就是数据库研究,因此不论在稳定性, 性能还就是使用方方面面,长期以来一直没有得到重视,直到 PostgreSQL 项目开始以后,情况才越来越好,PostgreSQL 已经完全可以胜任任何中上规模范围内得应用范围得业务 其次,PostgreSQL 得确还欠缺一些比较高端得数据库管理系统需要得特性,比如数据库集群,更优良得管理工具与更加自动化得系统优化功能等提高数据库性能得机制等。 5.目前官方最新版本:9、3、2 二、windows下安装过程 1、开始安装:

PostgreSql 基础知识

PostgreSql 常见数据类型 1.CREATE TYPE命令增加新的数据类型 2.数据类型

3.数值类型 3. 整数类型 smallint, integer, bigint 类型存储各种范围的全部是数字的数,也就是没有小数部分的数字。试图存储超出范围以外的数值将导致一个错误。 常用的类型是 integer ,因为它提供了在范围、存储空间、性能之间的最佳平衡。一般只有在磁盘空间紧张的时候才使用 smallint 。而只有在 integer 的范围不够的时候才使用 bigint ,因为前者绝对快得多。 bigint 类型可能不是在所有平台上都运转正确,因为它依赖编译器对八字节整数的支持。在那些没有八字节整数支持的机器上,bigint 的作用和 integer 一样(但是仍然占据八字节存储)。不过,我们目前还没听说过有这样的平台。 SQL 只声明了整数类型 integer(或 int) 和 smallint 。类型 bigint 和类型别名 int2, int4, int8 都是扩展,并且也在许多其它 SQL 数据库系统中使用。 4.任意精度数值 numeric 类型可以存储最多 1000 位精度的数字并且准确地进行计算。特别建议将它用于货币金额和其它要求精确计算的场合。不过,numeric 类型上的算术运算比整数类型要慢很多。 术语:一个 numeric 类型的标度(scale)是小数部分的位数,精度(precision)是全部数据位的数目,也就是小数点两边的位数总和。因此数字 23.5141 的精度为 6 而标度为 4 。你可以认为整数的标度为零。 numeric 字段的最大精度和最大标度都是可以配置的。要声明一个字段的类型为 numeric ,你可以用下面的语法: NUMERIC(precision, scale) 精度必须为正数,标度可以为零或者正数。另外, NUMERIC(precision) 选择了标度为 0 。不带任何精度与标度的声明 NUMERIC 则创建一个可以存储一个直到实现精度上限的任意精度和标度的数值,一个这样类型的字段将不会把输

PostgreSQL数据库安装教程

PostgreSQL数据库安装教程 (仅供参考) 最新更新:2014年08月27日 深圳市恩布网络科技有限公司 (内部技术文档)

目 录 1. Linux安装PostgreSQL数据库 (3) 1.1. 概述 (3) 1.2. 新建postgres用户和目录 (3) 1.3. 配置postgres用户的环境变量: (3) 1.4. yum安装 (3) 1.5. 初始化数据库目录 (3) 1.6. 给postgres赋予权限 (4) 1.7. 配置监听地址、端口 (4) 1.8. 配置支持远程连接 (4) 1.9. 设置开机启动 (4) 1.10. 启动服务 (4) 1.11. 修改postgres帐号密码 (4) 2. Windows安装PostgreSQL数据库 (5) 2.1. 概述 (5) 2.2. 安装 (5) 2.3. 配置监听地址、端口 (5) 2.4. 配置支持远程连接 (5) 3. 注意事项 (6) 4. 附录一:PostgreSQL数据库介绍 (6) 5. 附录二:PostgreSQL与MySQL比较 (6)

1.Linux安装PostgreSQL数据库 1.1.概述 以CentOS 6.4(或以上)X64(64位)版本,PostgreSQL8.4为例子说明。 本文仅供参考,如果安装不成功,或需要更多PostgreSQL技术资料,请自行上网搜索; 1.2.新建postgres用户和目录 mkdir /var/lib/pgsql groupadd postgres useradd ‐g postgres postgres 1.3.配置postgres用户的环境变量: cat >>/var/lib/pgsql/.bash_profile<

odbc安装文档

Linux/Unix下ODBC的安装 方法一: 先下载最新的unixODBC源码包(https://www.wendangku.net/doc/9d1480271.html,/unixODBC-2.2.1.tar.gz)放到/usr/local下,然后运行下述命令: 安装成功后,unixODBC所需的头文件都被安装到了/usr/inlucde下,编译好的库文件安装到了/usr/lib下,与unixODBC相关的可执行文件安装到了/usr/bin下,配置文件放到了/etc下。 方法二: 下载rpm包进行安装,我们这里以Red Hat 7.3为例: unixODBC-2.2.0-5 RPM for i386(安装包及源码包) (ftp://https://www.wendangku.net/doc/9d1480271.html,/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-2 .2.0-5.i386.rpm、 ftp://https://www.wendangku.net/doc/9d1480271.html,/linux/redhat/7.3/en/os/i386/SRPMS/unixODBC-2.2.0-5.src.rpm)unixODBC-devel-2.2.0-5 RPM for i386 (ftp://https://www.wendangku.net/doc/9d1480271.html,/linux/redhat/7.3/en/os/i386/RedHat/RPMS/unixODBC-d evel-2.2.0-5.i386.rpm) 直接将unixODBC-2.2.0-5.i386.rpm和unixODBC-devel-2.2.0-5.i386.rpm装入系统就可以了,命令如下:

Linux/Unix下ODBC的配置 运行ODBCConfig程序(在/usr/bin下),如下图: 图一:ODBCConfig主窗口 和Windows下的ODBC设置窗口是不是很像?我想大家都能看懂吧。 第一步:安装数据库的ODBC驱动程序 Drivers这一栏中用来设置数据库的驱动程序,点击Add按钮,会出现下图:

PostgreSQL学习手册:SQL语言函数

PostgreSQL学习手册:SQL语言函数 一、基本概念: SQL函数可以包含任意数量的查询,但是函数只返回最后一个查询(必须是SELECT)的结果。在简单情况下,返回最后一条查询结果的第一行。如果最后一个查询不返回任何行,那么该函数将返回NULL值。如果需要该函数返回最后一条SELECT语句的所有行,可以将函数的返回值定义为集合,即SETOF sometype。 SQL函数的函数体应该是用分号分隔的SQL语句列表,其中最后一条语句之后的分号是可选的。除非函数声明为返回void,否则最后一条语句必须是SELECT。事实上,在SQL函数中,不仅可以包含SELECT查询语句,也可以包含INSERT、UPDATE和DELETE等其他标准的SQL 语句,但是和事物相关的语句不能包含其中,如BEGIN、COMMIT、ROLLBACK和SAVEPOINT 等。 CREATE FUNCTION命令的语法要求函数体写成一个字符串文本。通常来说,该文本字符串常量使用美元符($$)围住,如: CREATE FUNCTION clean_emp() RETURNS void AS $$ DELETE FROM emp WHERE salary < 0; $$ LANGUAGE SQL; 最后需要说明的是SQL函数中的参数,PostgreSQL定义$1表示第一个参数,$2为第二个参数并以此类推。如果参数是复合类型,则可以使用点表示法,即$https://www.wendangku.net/doc/9d1480271.html,访问复合类型参数中的name字段。需要注意的是函数参数只能用作数据值,而不能用于标识符,如:INSERT INTO mytable VALUES ($1); --合法 INSERT INTO $1 VALUES (42); --不合法(表名属于标示符之一) 二、基本类型: 最简单的SQL函数可能就是没有参数且返回基本类型的函数了,如: CREATE FUNCTION one() RETURNS integer AS $$ SELECT 1 AS result; $$ LANGUAGE SQL; 下面的例子声明了基本类型作为函数的参数。 CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$ SELECT $1 + $2; $$ LANGUAGE SQL; # 通过select调用函数。 postgres=# SELECT add_em(1,2) AS answer; answer -------- 3 (1 row) 在下面的例子中,函数体内包含多个SQL语句,它们之间是用分号进行分隔的。CREATE FUNCTION tf1 (integer, numeric) RETURNS numeric AS $$ UPDATE bank SET balance = balance - $2 WHERE accountno = $1; SELECT balance FROM bank WHERE accountno = $1; $$ LANGUAGE SQL;

PostgreSQL安装详细步骤(windows)

PostgreSQL安装详细步骤 PostgreSQL安装: 一、windows下安装过程 安装介质:postgresql-9.5.3-1-windows-x64,安装过程非常简单,过程如下:1、开始安装:

2、选择程序安装目录: 注:安装 PostgreSQL 的分区最好是 NTFS 格式的。PostgreSQL 首要任务是要保证数据的完整性,而 FAT 和 FAT32 文件系统不能提供这样的可靠性保障,而且 FAT 文件系统缺乏安全性保障,无法保证原始数据在未经授权的情况下被更改。此外,PostgreSQL 所使用的"多分点"功能完成表空间的这一特征在FAT文件系统下无法实现。 然而,在某些系统中,只有一种 FAT 分区,这种情况下,可以正常安装PostgreSQL,但不要进行数据库的初始化工作。安装完成后,在 FAT 分区上手动执行 initdb.exe 程序即可,但不能保证其安全性和可靠性,并且建立表空间也会失败。 3、选择数据存放目录:

4、输入数据库超级用户和创建的OS用户的密码

注:数据库超级用户是一个非管理员账户,这是为了减少黑客利用在 PostgreSQL 发现的缺陷对系统造成损害,因此需要对数据库超级用户设置密码,如下图所示,安装程序自动建立的服务用户的用户名默认为 postgres。 5、设置服务监听端口,默认为5432 6、选择运行时语言环境

注:选择数据库存储区域的运行时语言环境(字符编码格式)。 在选择语言环境时,若选择"default locale"会导致安装不正确;同时,PostgreSQL 不支持 GBK 和 GB18030 作为字符集,如果选择其它四个中文字符集:中文繁体香港(Chinese[Traditional], Hong Kong S.A.R.)、中文简体新加坡(Chinese[Simplified], Singapore)、中文繁体台湾 (Chinese[Traditional], Taiwan)和中文繁体澳门(Chinese[Traditional], Marco S.A.R.),会导致查询结果和排序效果不正确。建议选择"C",即不使用区域。 ----我选择了default localt,安装正确;建议选择default localt。 7、安装过程(2分钟)

psql常用命令大全

psql常用命令大全 \d [ table ] 列出数据库中的表,或(如果声明了)表table 的列/字段.如果表名是用统配符(“*”)声明的,列出所有表和表的列/字段信息. \da 列出所有可用聚集. \dd object 列出pg_description 里对声明的对象的描述,对象可以是一个表,表中的列/字段,类型,操作符或聚集. 小技巧:并非所有对象在pg_description 里有描述.此后期命令在快速获取Postgres 内部特性时很有用. \df 列出函数. \di 只列出索引. \do 只列出操作符. \ds 只列出序列. \dS 列出系统表和索引. \dt 只列出非系统表. \dT 列出类型. \e [ filename ] 编辑当前查询缓冲或文件filename 的内容. \E [ filename ] 编辑当前查询缓冲或文件filename 的内容并且在编辑结束后执行之. \f [ separator ] 设置域分隔符.缺省是单个空白. \g [ { filename | |command } ] 将当前查询输入缓冲送给后端并且(可选的)将输出放到filename 或通过管道将输出送给一个分离的Unix shell 用以执行command. \h [ command ] 给出声明的SQL 命令的语法帮助.如果command 不是一个定义的SQL 命令(或在psql 里没有文档),或没有声明command ,这时psql将列出可获得帮助的所有命令的列表.如果命令command 是一个通配符(“*”),则给出所有SQL 命令的语法帮助. \H 切换HTML3 输出.等效于-H 命令行选项. \i filename 从文件filename 中读取查询到输入缓冲.

PostgreSQL索引

什么是索引? 索引的目的及优缺点? PostgreSQL中的索引及分类 索引是指按表中某些关键属性或表达式建立元组的逻辑顺序,它是由一系列表元组的标识号组成的一个列表。 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引的分类 按存储结构区分:“聚集索引(又称聚类索引,簇集索引)”,“分聚集索引(非聚类索引,非簇集索引)” 按数据唯一性区分:“唯一索引”,“非唯一索引” 按键列个数区分:“单列索引”,“多列索引”。 为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如: 在经常需要搜索的列上,可以加快搜索的速度; 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

MySQL和PostgreSQL两数据库的对决

MySQL和PostgreSQL两数据库的对决 在这篇文章中,我们选用MySQL4.0.2-alpha与PostgreSQL7.2进行比较,因为MySQL4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利。我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切。对于一个成熟的数据库,稳定性肯定会日益提供。而随着硬件性能的飞速提高,速度也不再是什么太大的问题。 一、前言 前一段时间,我曾经翻译过一篇将你的网站从MySQL改为PostgreSQL,其实当初我更感兴趣的是一个应用程序的后台数据库从MySQL转为PostgreSQL的具体操作,并没有关心MySQL和PostgreSQL的优劣,没想到反应出乎意料的大,因此我也就觉得有写这篇文章的必要了。 在这篇文章中,我们选用MySQL4.0.2-alpha与PostgreSQL7.2进行比较,因为MySQL4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利。 我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切。对于一个成熟的数据库,稳定性肯定会日益提供。而随着硬件性能的飞速提高,速度也不再是什么太大的问题。 二、两者的共同优势 这两个产品都属于开放源码的一员,性能和功能都在高速地提高和增强。MySQLAB的人们和PostgreSQL的开发者们都在尽可能地把各自的数据库改得越来越好,所以对于任何商业数据库使用其中的任何一个都不能算是错误的选择。 三、两者不同的背景 MySQL的背后是一个成熟的商业公司,而PostgreSQL的背后是一个庞大的志愿开发组。这使得MySQL的开发过程更为慎重,而PostgreSQL的反应更为迅速。 这样的两种背景直接导致了各自固有的优点和缺点。 四、MySQL的主要优点 1、首先是速度,MySQL通常要比PostgreSQL快得多。MySQL自已也宣称速度是他们追求的主要目标之一,基于这个原因,MySQL在以前的文档中也曾经说过并不准备支持事务和触发器。但是在最新的文档中,我们看到MySQL4.0.2-alpha已经开始支持事务,而且在MySQL的TODO中,对触发器、约束这样的注定会降低速度的功能也列入了日程。但是,我们仍然有理由相信,

GP 常用数据库命令

Greenplum 日常简明维护手册 1.数据库启动:gpstart 常用参数:-a : 直接启动,不提示终端用户输入确认 -m:只启动master 实例,主要在故障处理时使用 访问单个数据实例: PGOPTIONS='-c gp_session_role=utility' psql template1 -p 5432 启动某个segment instance :pg_ctl stop/start -D /datadir/ 取端口号: select * from gp_segment_configuration 启动以后会在/tmp/ 下生成一个.lock 隐藏文件,记录主进程号。

2.数据库停止:gpstop: 常用可选参数:-a:直接停止,不提示终端用户输入确认 -m:只停止master 实例,与gpstart –m 对应使用 -f:停止数据库,中断所有数据库连接,回滚正在运 行的事务 -u:不停止数据库,只加载pg_hba.conf 和postgresql.conf中 运行时参数,当改动参数配置时候使用。 连接数,重启 3.查看实例配置和状态 select * from gp_segment_configuration order by content ; select * from pg_filespace_entry ; 主要字段说明: Content:该字段相等的两个实例,是一对P(primary instance)和M(mirror Instance) Isprimary:实例是否作为primary instance 运行 Valid:实例是否有效,如处于false 状态,则说明该实例已经down 掉。 Port:实例运行的端口 Datadir:实例对应的数据目录 4.gpstate :显示Greenplum数据库运行状态,详细配置等信息 常用可选参数:-c:primary instance 和mirror instance 的对应关系 -m:只列出mirror 实例的状态和配置信息 -f:显示standby master 的详细信息 该命令默认列出数据库运行状态汇总信息,常用于日常巡检。 5.查看用户会话和提交的查询等信息 select * from pg_stat_activity该表能查看到当前数据库连接的IP 地址,用户

Sqoop官方中文手册

Sqoop中文手册 1. 概述 本文档主要对SQOOP的使用进行了说明,参考内容主要来自于Cloudera SQOOP的官方文档。为了用中文更清楚明白地描述各参数的使用含义,本文档几乎所有参数使用说明都经过了我的实际验证而得到。 2. codegen 将关系数据库表映射为一个java文件、java class类、以及相关的jar包, 1、将数据库表映射为一个Java文件,在该Java文件中对应有表的各个字段。 2、生成的Jar和class文件在metastore功能使用时会用到。 基础语句: sqoop codegen –connect jdbc:mysql://localhost:3306/hive –username root –password 123456 –table TBLS2

3. create-hive-table 生成与关系数据库表的表结构对应的HIVE表 基础语句: sqoop create-hive-table –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 –table TBLS –hive-table h_tbls2 4. eval

可以快速地使用SQL语句对关系数据库进行操作,这可以使得在使用import这种工具进行数据导入的时候,可以预先了解相关的SQL语句是否正确,并能将结果显示在控制台。 查询示例: sqoop eval –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 -query ―SELECT * FROM tbls LIMIT 10″ 数据插入示例: sqoop eval –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 -e ―INSERT INTO TBLS2 VALUES(100,1375170308,1,0,‘hadoop‘,0,1,‘guest‘,‘MANAGED_TABLE‘,‘abc‘,‘ddd‘)‖ -e、-query这两个参数经过测试,比如后面分别接查询和插入SQL语句,皆可运行无误,如上。 5. export 从hdfs中导数据到关系数据库中 sqoop export –connect jdbc:mysql://localhost:3306/hive –username root –password 123456 –table TBLS2 –export-dir sqoop/test

相关文档
相关文档 最新文档