• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    Linux下免費數據庫PostgreSQL開發入門

    發布: 2007-5-26 11:29 | 作者: 左錦 | 來源: IBM | 查看: 165次 | 進入軟件測試論壇討論

    領測軟件測試網
    本文介紹使用 C/C++ 結合數據庫自帶的 libpq 和 libPq++ 庫來開發 Linux 下有名的免費數據庫 PostgreSQL,詳細描述了怎樣使用開發庫來操作數據的步驟和流程。

    PostgreSQL數據庫介紹

    PostgreSQL 是一種運行在Unix和Linux操作系統(在NT平臺借助Cygnus也可以運行)平臺上的免費的開放源碼的關系數據庫。最早是由美國加州大學伯克利分校開發的,開始只是作為一個演示系統發表,但是隨著時間的推移,逐步分發,得到很多實際的應用,才逐步流行起來,F在版本發展到了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.c、 testC++.cpp。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>