日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Linux下免費(fèi)數(shù)據(jù)庫(kù)PostgreSQL開(kāi)發(fā)入門(mén)

系統(tǒng) 3144 0

PostgreSQL數(shù)據(jù)庫(kù)介紹

PostgreSQL是一種運(yùn)行在Unix和Linux操作系統(tǒng)(在NT平臺(tái)借助Cygnus也可以運(yùn)行)平臺(tái)上的免費(fèi)的開(kāi)放源碼的關(guān)系數(shù)據(jù)庫(kù)。最早是由美國(guó)加州大學(xué)伯克利分校開(kāi)發(fā)的,開(kāi)始只是作為一個(gè)演示系統(tǒng)發(fā)表,但是隨著時(shí)間的推移,逐步分發(fā),得到很多實(shí)際的應(yīng)用,才逐步流行起來(lái)。現(xiàn)在版本發(fā)展到了7.3.3。

榮譽(yù):

  • 1999年獲得Linux World雜志的該年度"最佳數(shù)據(jù)庫(kù)產(chǎn)品"稱(chēng)號(hào)。
  • 2000年榮獲Linux Journal雜志編輯選擇的"最佳數(shù)據(jù)庫(kù)"獎(jiǎng)。
  • 2003年,也就是最近再一次榮獲Linux Journal雜志編輯選擇的" 最佳數(shù)據(jù)庫(kù) "獎(jiǎng)。

2.主要功能和特性

  • 支持SQL。作為關(guān)系數(shù)據(jù)庫(kù),它支持SQL89標(biāo)準(zhǔn)也支持部分SQL92大部分功能。
  • 有豐富的數(shù)據(jù)類(lèi)型。許多數(shù)據(jù)類(lèi)型是一些商業(yè)數(shù)據(jù)庫(kù)都沒(méi)有提供的。
  • 面向?qū)ο蟆K艘恍┟嫦驅(qū)ο蟮募夹g(shù),如繼承和類(lèi)。
  • 支持大數(shù)據(jù)庫(kù),它不同于一般的桌面數(shù)據(jù)庫(kù),能夠支持幾乎不受限制大小的數(shù)據(jù)庫(kù),而且性能穩(wěn)定。
  • 方便集成web,提供一些接口方便 PHP,Perl等語(yǔ)言操作數(shù)據(jù)庫(kù)。
  • 事務(wù)處理。相對(duì)一些其他免費(fèi)數(shù)據(jù)庫(kù)如MySQL,他提供了事務(wù)處理,可以滿(mǎn)足一些商業(yè)領(lǐng)域的數(shù)據(jù)需要。

3.數(shù)據(jù)類(lèi)型

PostgreSQL支持豐富的數(shù)據(jù)類(lèi)型,許多數(shù)據(jù)類(lèi)型在商業(yè)數(shù)據(jù)庫(kù)中都無(wú)法提供。

  • 數(shù)值類(lèi)型。包括整數(shù)、任意精度、浮點(diǎn)類(lèi)型和序列類(lèi)型數(shù)值。
  • 貨幣類(lèi)型。范圍-21474836.48 到 +21474836.47。
  • 字符類(lèi)型。分為定長(zhǎng)類(lèi)型,不定長(zhǎng)有限制類(lèi)型和不定長(zhǎng)不限制長(zhǎng)度類(lèi)型。
  • 二進(jìn)制字符串。
  • 日期和時(shí)間類(lèi)型
  • 布爾類(lèi)型。
  • 幾何類(lèi)型。包括點(diǎn)、線、方形、路徑、多邊形和圓。
  • 網(wǎng)絡(luò)地址類(lèi)型。
  • 位串類(lèi)型。就是包含1和0的串。
  • 對(duì)象標(biāo)識(shí)符類(lèi)型
  • 數(shù)組類(lèi)型。


4.數(shù)據(jù)庫(kù)極限

參數(shù)名稱(chēng) 最大范圍
數(shù)據(jù)庫(kù)大小 無(wú)限制
表大小 16TB(所有系統(tǒng))
一條記錄大小 1.6GB
字段大小 1GB
表記錄條數(shù) 無(wú)限制
表字段數(shù) 250-1600(取決于字段的數(shù)據(jù)類(lèi)型)
表索引 無(wú)限制

事實(shí)上不可能存在無(wú)限制的情況。支持16TB大小的表不是單一文件保存,而是分為多個(gè)文件存儲(chǔ)的,所以不受限制于操作系統(tǒng)。

4.下載安裝

我們可以到 http://www.postgresql.org 網(wǎng)站下載,具體怎么安裝我就不贅述,大家可以看文檔,也可以看 參考 中的中文網(wǎng)站的文檔。在這里我就說(shuō)說(shuō)安裝中需要注意的幾個(gè)問(wèn)題。

注意

  • 不能以root登陸Linux來(lái)操作數(shù)據(jù)庫(kù)(啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)除外),請(qǐng)以root身份建立postgres用戶(hù),設(shè)置密碼后登錄。
  • 安裝完postgreSQL,可能需要初始化數(shù)據(jù)庫(kù),需要以postgres用戶(hù)登錄系統(tǒng),運(yùn)行
                    initdb -pqlib=/usr/lib/pqsql -pqdata=/var/lib/pqsal
                  


    如果你的pqlib目錄不同則需要按照你的實(shí)際路徑修改,pqdata也是這樣的。
  • 數(shù)據(jù)庫(kù)用戶(hù)與Linux用戶(hù)是不同的概念,只有數(shù)據(jù)庫(kù)用戶(hù)才能操作數(shù)據(jù)庫(kù),以postgres登錄Linux,然后是使用createuser來(lái)添加用戶(hù),dropuser來(lái)刪除用戶(hù),也可以使用SQL命令CREATE USER來(lái)創(chuàng)建。

5.常用命令


PostgreSQL數(shù)據(jù)庫(kù)常用操作命令:

Createdb 創(chuàng)建數(shù)據(jù)庫(kù)
Createuser 創(chuàng)建數(shù)據(jù)庫(kù)用戶(hù)
Dropdb 刪除數(shù)據(jù)庫(kù)
Dropuser 刪除數(shù)據(jù)庫(kù)用戶(hù)
Psql 交互式PostgreSQL前端工具,可以用它來(lái)操作數(shù)據(jù)庫(kù)
Initdb 初始化postgreSQL數(shù)據(jù)庫(kù)

這里不是介紹怎樣使用PostgreSQL數(shù)據(jù)庫(kù),所以對(duì)這些命令也不詳細(xì)解釋?zhuān)梢詤⒁?jiàn)文檔說(shuō)明和幫助。我在這里是假設(shè)讀者已經(jīng)安裝并初始化好了數(shù)據(jù)庫(kù),并且會(huì)使用psql和熟練SQL來(lái)交互操作數(shù)據(jù)。


PostgreSQL 的C/C++接口介紹

PostgreSQL提供很多不同語(yǔ)言的接口,有C、C++、Perl、Tcl等等,這里主要是介紹C/C++怎樣連接到數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)進(jìn)行添加,查詢(xún)等操作。

1.C語(yǔ)言接口

  • 頭文件libqp-fe.h 連接時(shí)需要添加連接參數(shù)-lpq也就是連接libpq庫(kù)。
  • 建立數(shù)據(jù)庫(kù)連接函數(shù)
                    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)
    
                  

    建立非阻塞連接函數(shù)

                    PGconn *PQconnectStart(const char *conninfo)
    PostgresPollingStatusType *PQconnectPoll(PQconn *conn)
    
                  
  • 執(zhí)行查詢(xún)函數(shù)
                    PGresult *PQexec(PGconn *conn,const char *query) 返回查詢(xún)的結(jié)構(gòu)集。
    int PQntuples(const Pgresult *res) 返回查詢(xún)結(jié)果里的記錄個(gè)數(shù)。
    int PQnfields(const Pgresult *res) 返回記錄中的字段的個(gè)數(shù)。
    char *PQfname(const Pgresult *res,int field_index)返回結(jié)構(gòu)集中某一字段的名稱(chēng)。
    Oid PQftype(const Pgresult *res, int field_index) 返回結(jié)構(gòu)集中某一字段的數(shù)據(jù)類(lèi)型。
    char *PQgetvalue(const Pgresult *res,int tup_num, int field_index)
    返回結(jié)構(gòu)集中某一條記錄中某一個(gè)字段的值。
    
                  

    這里只列舉最常用的一些函數(shù),具體說(shuō)明可以參見(jiàn)文檔。

  • 大對(duì)象數(shù)據(jù)操作,主要使用下列函數(shù)在SQL語(yǔ)句中操作大對(duì)象數(shù)據(jù)。
    Oid lo_creat(PGconn *conn,

    int mode)

    創(chuàng)建一個(gè)新的大對(duì)象.mode 是一個(gè)位掩碼,描述新對(duì)象的不同屬性
    Oid lo_import(PGconn *conn,

    const char *filename)

    把文件作為大對(duì)象導(dǎo)入數(shù)據(jù)庫(kù)
    int lo_export(PGconn *conn,

    Oid lobjId, const char *filename)

    大對(duì)象導(dǎo)入出數(shù)據(jù)庫(kù),保存為文件
    int lo_open(PGconn *conn,

    Oid lobjId, int mode)

    打開(kāi)一個(gè)現(xiàn)存的大對(duì)象
    int lo_write(PGconn *conn, int fd,

    const char *buf, size_t len)

    大對(duì)象寫(xiě)入數(shù)據(jù)
    int lo_read(PGconn *conn, int fd,

    char *buf, size_t len)

    從大對(duì)象讀取數(shù)據(jù)
    int lo_lseek(PGconn *conn, int fd,

    int offset, int whence)

    對(duì)大對(duì)象數(shù)據(jù)進(jìn)行查找
    int lo_close(PGconn *conn, int fd) 關(guān)閉大對(duì)象描述符

    函數(shù)在fe-lobj.c文件中定義,具體使用參見(jiàn) Accessing Large Objects from libpq

    上面函數(shù)的具體介紹請(qǐng)參見(jiàn) PostgreSQL v7.0 文檔 在這里就不詳細(xì)介紹了。這里省略列舉狀態(tài)檢查函數(shù),參見(jiàn)參考文檔。

    使用C語(yǔ)言訪問(wèn)數(shù)據(jù)庫(kù)的除了libpq庫(kù),還有其他如 libpqeasy,ecpg 等接口。

2.C++語(yǔ)言接口

  • 頭文件 libpq++.h 連接需要的庫(kù)位 pq++,連接參數(shù)是 -lpq++
  • libpq++ 類(lèi)繼承關(guān)系圖


  • 類(lèi)簡(jiǎn)介
    PgConnection成員函數(shù)
    PgConnection(const char* conninfo) 參數(shù)同下
    Connect(const char* conninfo) 同 PQconnectdb
    Exec(const char* query) 同 PQexec
    ExecCommandOk(const char* query) 運(yùn)行命令并檢查狀態(tài)是否PGRES_COMMAND_OK
    ExecTuplesOk(const char* query) 運(yùn)行查詢(xún)并檢查狀態(tài)是否PGRES_TUPLES_OK
    IntToString(int n) 數(shù)字轉(zhuǎn)換為字符串
    ConnectionBad() 連接是否失敗
    ErrorMessage() 返回錯(cuò)誤信息
    DBName() 同 PQdb

    詳細(xì)說(shuō)明參見(jiàn)文檔

    PgDatabase 的常用成員函數(shù)
    PgDatabase(const char* conninfo) 構(gòu)造函數(shù)連接到數(shù)據(jù)庫(kù),跟 Pqconnectdb參數(shù)相同
    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
  • 大對(duì)象操作使用 PgLargeObject 類(lèi)來(lái)操作。

例子程序

以 postgres 用戶(hù)或者具有建立數(shù)據(jù)庫(kù)用戶(hù)權(quán)限的用戶(hù)登錄 Linux,先建立數(shù)據(jù)庫(kù)。

            [zuojin@itpark85 zuojin]$createdb test_db

          

然后使用 psql 連接到數(shù)據(jù)庫(kù)

            [zuojin@itpark85 zuojin]$psql test_db

          

連接到數(shù)據(jù)庫(kù)建立表,如下圖所示


插入測(cè)試用數(shù)據(jù),如圖:


(注意:psql中輸入SQL語(yǔ)句要以"; "結(jié)束才執(zhí)行,幫助命令是"http://?",退出命令是"http://q")。


1)C語(yǔ)言例子

            #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";
   /**數(shù)據(jù)庫(kù)名*/ 
   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");
   
   /**運(yùn)行查詢(xún)命令*/
   if(  PQresultStatus(res)  !=  PGRES_TUPLES_OK) {
       fprintf(stderr,"Exec Query Fauled!//n");
       PQclear(res);
	   return 0;
   }
     
   i = PQntuples(res);
   /**取得查詢(xún)的結(jié)果的記錄的數(shù)量*/ 
   t = PQnfields(res);
   /**取得字段數(shù)量*/
   for(s=0; s<i;s++) {
       for (k = 0; k<t; k++) {
           printf("%s",PQgetvalue(res,s,k));
           printf("  ");
       }
       printf("http://n");
   }
   PQfinish(conn);
   PQclear(res);
   return 0;
}

          

運(yùn)行結(jié)果如圖所示




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++) /**顯示字段名稱(chēng)*/ {
        cout<<data.FieldName(k);
        cout <<"      "     ;
    }
    cout<<endl;
    for (int i = 0; i < data.Tuples(); i++) /**取得查詢(xún)結(jié)果的記錄數(shù)量*/  {
       	for(int k=0; k<data.Fields(); k++) {
        	cout << data.GetValue(i,k);
        	cout <<" | "     ;
        }
        cout<<endl;
    }
    return 0 ;
}

          

運(yùn)行結(jié)果如圖所示


本文的樣例代碼: testC.c testC++.cpp

<!-- CMA ID: 21234 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

參考資料

Linux下免費(fèi)數(shù)據(jù)庫(kù)PostgreSQL開(kāi)發(fā)入門(mén)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 招远市| 府谷县| 安泽县| 岑溪市| 眉山市| 额济纳旗| 越西县| 思茅市| 长顺县| 阿鲁科尔沁旗| 蒙城县| 全椒县| 尖扎县| 鹤峰县| 浦城县| 柳江县| 嵊州市| 小金县| 梅河口市| 东宁县| 济宁市| 岳普湖县| 蒲江县| 临潭县| 延寿县| 五原县| 西峡县| 台中市| 太保市| 天柱县| 麟游县| 岚皋县| 犍为县| 荣昌县| 浦北县| 巩义市| 卢湾区| 昌都县| 都安| 赤壁市| 凤台县|