Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1763343
  • 博文数量: 782
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 4140
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 21:37
个人简介

Linux ,c/c++, web,前端,php,js

文章分类

全部博文(782)

文章存档

2015年(8)

2014年(28)

2013年(110)

2012年(307)

2011年(329)

分类: LINUX

2011-04-12 13:08:16

  PostgreSQL数据库介绍

  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.6GB
字段大小 1GB
表记录条数 无限制
表字段数 250-1600(取决于字段的数据类型)
表索引 无限制

  事实上不可能存在无限制的情况。支持16TB大小的表不是单一文件保存,而是分为多个文件存储的,所以不受限制于操作系统。

  4.下载安装

  我们可以到 网站下载,具体怎么安装我就不赘述,大家可以看文档,也可以看 参考中的中文网站的文档。在这里我就说说安装中需要注意的几个问题。

  注意

  不能以root登陆Linux来操作数据库(启动数据库服务除外),请以root身份建立postgres用户,设置密码后登录。

  安装完postgreSQL,可能需要初始化数据库,需要以postgres用户登录系统,运行initdb -pqlib=/usr/lib/pqsql -pqdata=/var/lib/pqsal

  如果你的pqlib目录不同则需要按照你的实际路径修改,pqdata也是这样的。

  数据库用户与Linux用户是不同的概念,只有数据库用户才能操作数据库,以postgres登录Linux,然后是使用createuser来添加用户,dropuser来删除用户,也可以使用SQL命令CREATE USER来创建。

  5.常用命令

  PostgreSQL数据库常用操作命令:

Createdb 创建数据库
Createuser 创建数据库用户
Dropdb 删除数据库
Dropuser 删除数据库用户
Psql 交互式PostgreSQL前端工具,可以用它来操作数据库
Initdb 初始化postgreSQL数据库

  这里不是介绍怎样使用PostgreSQL数据库,所以对这些命令也不详细解释,可以参见文档说明和帮助。我在这里是假设读者已经安装并初始化好了数据库,并且会使用psql和熟练SQL来交互操作数据。

  PostgreSQL 的C/C++接口介绍

  PostgreSQL提供很多不同语言的接口,有C、C++、Perl、Tcl等等,这里主要是介绍C/C++怎样连接到数据库,对数据进行添加,查询等操作。

  1.C语言接口

  头文件libqp-fe.h 连接时需要添加连接参数-lpq也就是连接libpq库。

  建立数据库连接函数PGconn *PQconnectdb( const char *conninfo)
PGconn *PQsetdbLogin(const char *pghost,
                    const char *pgport,
                   const char *pgoptions,
                   const char *pgtty,
                   const char *dbName,
                   const char *login,
                   const 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) 关闭大对象描述符

  函数在fe-lobj.c文件中定义,具体使用参见 Accessing Large Objects from libpq

  上面函数的具体介绍请参见 PostgreSQL v7.0文档 在这里就不详细介绍了。这里省略列举状态检查函数,参见参考文档。

  使用C语言访问数据库的除了libpq库,还有其他如 libpqeasy,ecpg 等接口。

  2.C++语言接口

  头文件 libpq++.h 连接需要的库位 pq++,连接参数是 -lpq++

  libpq++ 类继承关系图

Linux下免费数据库PostgreSQL开发入门

  类简介

  

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

  连接到数据库建立表,如下图所示

Linux下免费数据库PostgreSQL开发入门

  插入测试用数据,如图:

Linux下免费数据库PostgreSQL开发入门

  (注意: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    for (k = 0; k      printf("%s",PQgetvalue(res,s,k));
      printf(" ");
    }
    printf("n");
  }
  PQfinish(conn);
  PQclear(res);
  return 0;
}

  运行结果如图所示

Linux下免费数据库PostgreSQL开发入门

  2)C++例子

#include
#include
int main() {
  char query_string[256]= "SELECT * FROM test;";
  PgDatabase data("dbname = test_db");
  if (data.ConnectionBad()) {
    cout <<"connected failed" << endl;
     cout <<"Error is "<    exit(1);
  }
  if (! data.ExecTuplesOk(query_string)) {
    cout<<"Query Failed!" << endl;
    exit(1);
  }
  for(int k=0; k    cout<    cout <<"   "   ;
  }
  cout<  for (int i = 0; i < data.Tuples(); i++) /**取得查询结果的记录数量*/ {
      for(int k=0; k      cout << data.GetValue(i,k);
      cout <<" | "   ;
    }
    cout<  }
  return 0 ;
}

  运行结果如图所示

Linux下免费数据库PostgreSQL开发入门

  本文的样例代码: testC.c、 testC++.cpp。

阅读(1419) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~