`
isiqi
  • 浏览: 16652099 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
使用C/C++开发PostgreSQL <!-- author info begin-->

左锦(zuo170@163.com)
2003年8月

<!-- author inof end-->
本文介绍使用 C/C++ 结合数据库自带的 libpq 和 libPq++ 库来开发 Linux 下有名的免费数据库 PostgreSQL,详细描述了怎样使用开发库来操作数据的步骤和流程。

PostgreSQL数据库介绍

1.简介

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.下载安装

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

注意

  • 不能以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++ 类继承关系图

  • 类简介
    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 <stdio.h>
#include <libpq-fe.h>
 
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<i;s++) {
       for (k = 0; k<t; k++) {
           printf("%s",PQgetvalue(res,s,k));
           printf("  ");
       }
       printf("\\n");
   }
   PQfinish(conn);
   PQclear(res);
   return 0;
}

运行结果如图所示

2)C++例子


#include <iostream.h>
#include <libpq++.h> 

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

运行结果如图所示

本文的样例代码:testC.ctestC++.cpp

参考

  1. PostgreSQL网站中文网站
  2. PostgreSQL文档
  3. Red Hat Database

<!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed-->
关于作者
<!-- about author begin-->

左锦,就职南沙资讯科技园,喜爱 Linux,Java 还有蓝天白云青山绿水。您可以通过zuo170@163.com与他联系。

分享到:
评论

相关推荐

    PostgreSQL从入门到精通视频教程(全).zip

    这个“PostgreSQL从入门到精通视频教程”旨在帮助初学者和有经验的开发者深入理解PostgreSQL的核心概念和高级特性。 **一、基础篇** 1. **安装与配置**:了解如何在不同的操作系统(如Windows、Linux、macOS)上...

    PostgreSQL从入门到精通

    根据所提供的文件内容,以下是对PostgreSQL从入门到精通的知识点的详细说明...整体来说,文档覆盖了PostgreSQL数据库的基础知识、安装、操作、管理工具和高级特性,为用户从入门到精通PostgreSQL提供了全面的学习路径。

    PostgreSQL数据库入门视频教程.rar

    总的来说,这套PostgreSQL入门视频教程全面覆盖了数据库的基础知识和实践操作,适合对数据库感兴趣的初学者和希望提升PostgreSQL技能的开发者。通过学习,你将能够熟练地搭建环境、操作数据库,并为后续的数据库设计...

    从理论到实践——Linux下的数据库学习之路.pdf

    在IT领域,数据库是至关重要的组成部分,特别是在Linux操作系统中,其稳定性和可靠性使其成为许多企业的首选平台...通过系统的学习和实践,你可以成为一个精通Linux数据库的专业人士,为企业信息管理提供强有力的支持。

    Postgresql从入门到精通

    4. PostgreSQL是一种开源的对象关系数据库管理系统,它是由PostgreSQL全球开发小组维护的。 5. PostgreSQL的历史简介、架构和特点。 6. 什么是开源?开源指的是源代码可以被任何人自由使用、修改和分发的软件。 7. ...

    Linux开发工程师开发入门手册

    Linux 开源项目入门手册 作为一名 Linux 开发工程师,掌握开源项目是我们工作中不可或缺的灵感来源。本文档将揭露哪些基础开源软件库是 Linux 开发工程师必须掌握的。 一、网络 网络库是 Linux 开发工程师必须掌握...

    数据库PostgreSQL从小工到专家

    根据提供的文件信息,我们可以从标题、描述以及部分内容中提炼出以下关键知识点,这些知识点主要围绕PostgreSQL数据库系统展开,从入门到精通的过程。 ### 1. PostgreSQL简介 - **PostgreSQL**:是一款开源的关系...

    Postgresql在Linux下的配置与C程序应用

    Postgresql在Linux下的配置与C程序应用这些入门的常识实在不敢去CU上发,不过觉得确实很实用,对于初学者也很重要,所以只好在自己的博客备份一下。 从www.postgresql.org下载pgadmin3-1.6.2.zip和postgresql-8.2.3....

    PostgreSQL新手入门教程

    总结起来,PostgreSQL新手入门需要掌握的基础知识点主要包括:安装过程、创建用户和数据库、登录数据库的方法等。掌握了这些基础操作,用户就可以开始探索和使用PostgreSQL数据库进行数据的存储、查询和其他相关操作...

    PostgreSQL从菜鸟到专家(中译稿by洞庭湖的泥鳅)

    PostgreSQL也获得数个奖项,包括三次被评为Linux Journal杂志编辑选择奖最佳数据库(2000,2003和2004年度)以及2004年度Linux新媒体奖最佳数据库系统。我们也许我们有点超越自我。你也许想知道到底PostgreSQL是什么...

    Linux环境数据库管理员指南

    第7章:在 Linux上安装MySQL MySQL是最流行的免费数据库。它很容易设置和配置,利用它很容易编制出很好的基于 Web的应用程序。不过对非常大的数据库,它的可伸缩性稍差。 第8章:在Linux上安装和管理Progress ...

    PostgreSQL从入门到精通.rar

    **PostgreSQL:数据库管理系统概述** PostgreSQL,简称PG,是一种开源的关系型数据库管理系统(RDBMS),它以其强大的功能、高度的稳定性和优秀的性能而受到全球开发者和企业的青睐。PostgreSQL支持SQL标准,并且...

    PostgreSQL基础教程.rar_postgresql

    PostgreSQL,通常简称为PG,是一种开源的关系型数据库管理系统(RDBMS),它以其强大的功能、高度的稳定性和优秀的性能而受到全球开发者和企业的青睐。本教程将带你深入理解PostgreSQL的基础知识,助你开启数据库...

    PostgreSQL基本操作

    对于Linux环境下的PostgreSQL入门,手册主要涵盖了以下方面: 1. 安装:PostgreSQL在Linux下的安装涉及包的选择和依赖性管理。建议在安装时尽量选择所有可能需要的包,以防后期需要手动处理包的依赖关系。安装后,...

    PostgreSQL9.3 DBA最佳实战培训PPT 580页

    PostgreSQL作为一个开源的关系型数据库管理系统,因其强大的功能、稳定性及高度的可扩展性,受到了广大开发人员和DBA的青睐。本套580页的PostgreSQL 9.3 DBA最佳实战培训资料,旨在帮助新手从零基础快速掌握...

Global site tag (gtag.js) - Google Analytics