PostgreSQL是在Unix和Linux操作系统(在NT平台上也可以在Cygnus上运行)平台上运行的免费开源关系数据库。 最初由美国加利福尼亚大学伯克利分校开发,最初作为演示系统发布,但随着时间的推移而分发,得到了很多实用化,并逐渐流行起来。 目前,版本已发展到7.3.3。
荣誉: 1999年获得Linux World杂志本年度“最佳数据库产品”称号。
2000年获得了Linux Journal杂志编辑评选的“最佳数据库”奖。
2003年,也就是最近再次获得了Linux Journal杂志编辑评选的“最佳数据库”奖。
2 .主要功能和特性支持SQL。 作为关系数据库,支持SQL89标准和某些SQL92功能。
有丰富的数据类型。 有些业务数据库中不提供许多数据类型。
面向对象。 包括面向对象的技术,如继承和类。
与典型的桌面数据库不同,它支持几乎没有大小限制的数据库,并支持性能稳定的大型数据库。
它易于集成web,为PHP、Perl等语言操作数据库提供了方便的界面。
事务处理。 对于其他免费数据库(如MySQL ),他提供了一些事务来满足业务领域的数据需求。
3 .数据类型
PostgreSQL支持丰富的数据类型,许多数据类型在商业数据库中不可用。 数值类型。 包括整数、任意精度、浮点型和序列型数值。
货币类型。 范围-21474836.48至21474836.47。
字符类型。 分为定长类型,不定长度有限制的类型和不定长度没有限制的类型。
二进制字符串。
日期和时间类型
布尔型。
几何类型。 包括点、线、四边形、路径、多边形和圆。
网络地址的类型。
位串的类型。 一个包含1和0的字符串。
对象标识符类型
数组类型。
4 .数据库局限性
参数名称的最大范围
数据库大小无限制
表大小16TB (所有系统)。
1个记录的大小为1.6GB
字段大小1GB
表记录数无限制
表字段数250-1600 (取决于字段的数据类型) )。
表索引无限制
事实上,不可能有无限制的情况。 支持16TB大小的表存储为多个文件,而不是单个文件,因此不限于操作系统。
4 .下载安装
可从http://www.postgresql.org网站下载。 虽然不具体说明如何安装,但是可以查看文档,也可以查看参考中的中文网站的文档。 这里谈谈安装中应注意的几个问题。
请注意,您不能通过root登录到Linux来操作数据库。 启动数据库服务除外。 请以root身份创建postgres用户,设置密码登录。
安装postgreSQL后,可能需要初始化数据库。 必须以postgres用户身份登录系统并运行initdb-pq lib=/usr/lib/pq SQL-pq data=/var/lib/pq sal
如果您的pqlib目录不同,则必须根据实际路径进行修改。 pqdata也是如此。
数据库用户是与Linux用户不同的概念,只有数据库用户可以与数据库交互,在postgres中登录到Linux,然后使用createuser添加用户,并使用dropuser删除用户
5 .常用命令
PostgreSQL数据库常规操作命令:
创建创建b数据库
创建创建用户数据库用户
Dropdb删除数据库
Dropuser删除数据库用户
PostgreSQL交互式PostgreSQL前端工具。 可用于操作数据库
Initdb初始化postgreSQL数据库
由于此处不介绍如何使用PostgreSQL数据库,因此也不详细介绍这些命令。 请参考手册的说明和帮助。 这里假设读者安装和初始化数据库,并使用psql和熟练的SQL交互处理数据。
PostgreSQL提供了多种语言的接口,包括c、c、Perl和Tcl。 本节主要介绍C/C如何连接到数据库、添加数据和执行查询。
1 .要连接c语言接口头文件libqp-fe.h,必须连接到连接参数-lpq (即libpq库)。
建立数据库连接函数pg conn * pq连接数据库(常数char * conn info )
pg conn * pqsetdblogin (常数char * p ghost,
常数char * pg port,
常数char * pg选项,
常数char * pg tty,
常数char * dbname,
常数char * log in,
常数char * pwd )
创建非块连接函数
PGconn *PQconnectStart(const char *conninfo)
PostgresPollingStatusType *PQconnectPoll(PQconn *conn)
执行查询函数
PGresult *PQexec(PGconn *conn,const char *query) 返回查询的结构集。
int PQntuples(const Pgresult *res) 返回查询结果里的记录个数。
int PQnfields(const Pgresult *res) 返回记录中的字段的个数。
char *PQfname(const Pgresult *res,int field_index)返回结构集中某一字段的名称。
Oid PQftype(const Pgresult *res, int field_index) 返回结构集中某一字段的数据类型。
char *PQgetvalue(const Pgresult *res,int tup_num, int field_index)
返回结构集中某一条记录中某一个字段的值。
这里只列举最常用的一些函数,具体说明可以参见文档。
大对象数据操作,主要使用下列函数在SQL语句中操作大对象数据。Oid lo_creat(PGconn *conn,
int mode)创建一个新的大对象.mode 是一个位掩码,描述新对象的不同属性
Oid lo_import(PGconn *conn,
const char *filename)把文件作为大对象导入数据库
int lo_export(PGconn *conn,
Oid lobjId, const char *filename)大对象导入出数据库,保存为文件
int lo_open(PGconn *conn,
Oid lobjId, int mode)打开一个现存的大对象
int lo_write(PGconn *conn, int fd,
const char *buf, size_t len)大对象写入数据
int lo_read(PGconn *conn, int fd,
char *buf, size_t len)从大对象读取数据
int lo_lseek(PGconn *conn, int fd,
int offset, int whence)对大对象数据进行查找
int lo_close(PGconn *conn, int fd)关闭大对象描述符
上面函数的具体介绍请参见 PostgreSQL v7.0文档 在这里就不详细介绍了。这里省略列举状态检查函数,参见参考文档。
使用C语言访问数据库的除了libpq库,还有其他如 libpqeasy,ecpg 等接口。
2.C++语言接口头文件 libpq++.h 连接需要的库位 pq++,连接参数是 -lpq++
libpq++ 类继承关系图
类简介
PgConnection成员函数
PgConnection(const char* conninfo)参数同下
Connect(const char* conninfo)同 PQconnectdb
Exec(const char* query)同 PQexec
ExecCommandOk(const char* query)运行命令并检查状态是否PGRES_COMMAND_OK
ExecTuplesOk(const char* query)运行查询并检查状态是否PGRES_TUPLES_OK
IntToString(int n)数字转换为字符串
ConnectionBad()连接是否失败
ErrorMessage()返回错误信息
DBName()同 PQdb
详细说明参见文档PgDatabase 的常用成员函数
PgDatabase(const char* conninfo)构造函数连接到数据库,跟 Pqconnectdb参数相同
Tuples()同 PQntuples();
CmdTuples()同 PQcmdTuples
Fields()同 PQnfields
FieldName(int field_num)同 PQfname
FieldNum(const char* field_name)同 PQfnumber
FieldType(int ield_num)
FieldType(const char* field_name)同 PQftype
FieldSize(int field_num)
FieldSize(const char* field_name)同 PQfsize
GetValue(int tup_num, int field_num)
GetValue(int tup_num, const char* field_name)同 PQgetvalue
GetIsNull(int tup_num, int field_num)
GetIsNull(int tup_num, const char* field_name)同 PQgetisnull
GetLength(int tup_num, int field_num)
GetLength(int tup_num, const char* field_name)同 PQgetlength
GetLine(char* string, int length)同 PQgetline
PutLine(const char* string)同 PQputline
EndCopy()同 PQendcopy
大对象操作使用 PgLargeObject 类来操作。
以 postgres 用户或者具有建立数据库用户权限的用户登录 Linux,先建立数据库。[zuojin@itpark85 zuojin]$createdb test_db
然后使用 psql 连接到数据库[zuojin@itpark85 zuojin]$psql test_db
连接到数据库建立表,如下图所示
插入测试用数据,如图:
(注意:psql中输入SQL语句要以”; “结束才执行,帮助命令是”\\?”,退出命令是”\\q”)。
1)C语言例子
#include #include int main() {
PGconn *conn;
PGresult *res;
char *pghost = NULL;
char *pgport =NULL;
char *pgoptions =NULL;
char *pgtty = NULL;
char *dbname =”test_db”;
/**数据库名*/
int i = 0,t = 0,s,k;
conn = PQsetdb(pghost,pgport,pgoptions,pgtty,dbname);
if (PQstatus(conn) == CONNECTION_BAD) {
fprintf(stderr,”Connection to database ‘%s’ failed!\\n”,dbname);
PQfinish(conn);
eturn 0;
}
res = PQexec(conn,”SELECT * FROM test”);
/**运行查询命令*/
if( PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr,”Exec Query Fauled!\\n”);
PQclear(res);
return 0;
}
i = PQntuples(res);
/**取得查询的结果的记录的数量*/
t = PQnfields(res);
/**取得字段数量*/
for(s=0; s
运行结果如图所示
2)C++例子
#include #include int main() {
char query_string[256]= “SELECT * FROM test;”;
PgDatabase data(“dbname = test_db”);
if (data.ConnectionBad()) {
cout <
运行结果如图所示
快三三期必中口诀s()同 PQcmdTuples
Fields()同 PQnfields
FieldName(int field_num)同 PQfname
FieldNum(const char* field_name)同 PQfnumber
FieldType(int ield_num)
FieldType(const char* field_name)同 PQftype
FieldSize(int field_num)
FieldSize(const char* field_name)同 PQfsize
GetValue(int tup_num, int field_num)
GetValue(int tup_num, const char* field_name)同 PQgetvalue
GetIsNull(int tup_num, int field_num)
GetIsNull(int tup_num, const char* field_name)同 PQgetisnull
GetLength(int tup_num, int field_num)
GetLength(int tup_num, const char* field_name)同 PQgetlength
GetLine(char* string, int length)同 PQgetline
PutLine(const char* string)同 PQputline
EndCopy()同 PQendcopy
大对象操作使用 PgLargeObject 类来操作。
以 postgres 用户或者具有建立数据库用户权限的用户登录 Linux,先建立数据库。[zuojin@itpark85 zuojin]$createdb test_db
然后使用 psql 连接到数据库[zuojin@itpark85 zuojin]$psql test_db
连接到数据库建立表,如下图所示
插入测试用数据,如图:
(注意:psql中输入SQL语句要以”; “结束才执行,帮助命令是”\\?”,退出命令是”\\q”)。
1)C语言例子
#include #include int main() {
PGconn *conn;
PGresult *res;
char *pghost = NULL;
char *pgport =NULL;
char *pgoptions =NULL;
char *pgtty = NULL;
char *dbname =”test_db”;
/**数据库名*/
int i = 0,t = 0,s,k;
conn = PQsetdb(pghost,pgport,pgoptions,pgtty,dbname);
if (PQstatus(conn) == CONNECTION_BAD) {
fprintf(stderr,”Connection to database ‘%s’ failed!\\n”,dbname);
PQfinish(conn);
eturn 0;
}
res = PQexec(conn,”SELECT * FROM test”);
/**运行查询命令*/
if( PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr,”Exec Query Fauled!\\n”);
PQclear(res);
return 0;
}
i = PQntuples(res);
/**取得查询的结果的记录的数量*/
t = PQnfields(res);
/**取得字段数量*/
for(s=0; s
运行结果如图所示
2)C++例子
#include #include int main() {
char query_string[256]= “SELECT * FROM test;”;
PgDatabase data(“dbname = test_db”);
if (data.ConnectionBad()) {
cout <
运行结果如图所示