postgresql c语言,任意语言访问PostgreSQL:C语言接口
開源軟件的一個(gè)好處是可以根據(jù)需要修改程序代碼。如果程序后臺(tái)使用PostgreSQL數(shù)據(jù)庫,可以很容易用各種語言對(duì)其進(jìn)行訪問。本文作為系列文章的第一篇,會(huì)陸續(xù)介紹C、C++、PHP、Tcl、Python及Perl等編程語言對(duì)PostgreSQL的訪問方法。 需要說明的是,本文不太適合完全沒有編程經(jīng)驗(yàn)的讀者。不過只要讀者有基本的SQL知識(shí),以及懂得至少一種編程語言即可看懂。也許讀者正在使用的系統(tǒng)是Linux,但是只要使用的客戶端API接口在其他系統(tǒng)可用,則程序代碼不需更改即可在其他操作系統(tǒng)上正常使用。本文所示的代碼全部基于Postgre 9.1,是目前最新的穩(wěn)定版本,已經(jīng)安裝并經(jīng)過測試。在本文的操作環(huán)境中,客戶端與服務(wù)端位于不同的計(jì)算機(jī),但位于同一局域網(wǎng)內(nèi),這種情況下可以在客戶端通過命令gpsql -U postgre -h x.x.x.x很容易地連接到服務(wù)端。
首先要確保在客戶端機(jī)器上有安裝軟件的權(quán)限,并且最好確保當(dāng)前使用的數(shù)據(jù)庫只做當(dāng)前測試用,以免任何因不小心的操作導(dǎo)致重要數(shù)據(jù)的損壞。
C語言接口
在與數(shù)據(jù)庫連接方面,C語言是一種常用語言,許多數(shù)據(jù)庫都是用C寫的。該語言高效靈活,因此如果想要寫一款客戶端接口,不管是僅僅包含控制臺(tái)還是基于GUI的,并且不想用到瀏覽器,C語言也許是最好的選擇。
連接C語言與Postgres使用的庫名為libpq,它與PostgreSQL源碼樹綁定在一起。如果安裝數(shù)據(jù)庫系統(tǒng)時(shí)使用的是二進(jìn)制文件而不是從源碼編譯安裝,libpq可被單獨(dú)安裝,但也要記得需要使用選項(xiàng)-dev package(或-devel,取決于Linux系統(tǒng)的版本)。在Debian及其分發(fā)版上,安裝libpq的命令為 #aptitude install libpq-dev。在基于RedHat的系統(tǒng)上,如CentOS,可以在postgresqlxx-libs包中找到libpq,其中xx為主要和次要版本號(hào)。因此要連接到PostgreSQL 9.1數(shù)據(jù)庫,如果使用Fedora16,則需要安裝postgresql91-lib或postgresql-devel。由于RHEL/CentOS用戶大多使用Postgres庫,導(dǎo)致程序的名稱可能會(huì)有一些不同,而且由于Fedora用戶能夠使用更多最新的包,因此僅僅在使用一個(gè)舊版本時(shí)才需要第三方庫。簡而言之,任何支持PostgreSQL的系統(tǒng)均有其可用的libpq。
除了C語言,libpq同時(shí)也是C++、Perl和Tcl的API引擎,提供基本的函數(shù)對(duì)數(shù)據(jù)庫進(jìn)行連接、查詢和修改。許多常用的函數(shù)都包含“PQ”前綴,如PQconnectdb或PQerrormessage。更多示例可查看PostgreSQL文檔或查看src/test/examples。在C程序文件中,包含libpq-fe.h頭文件并在編譯時(shí)添加相應(yīng)的鏈接標(biāo)記-lpq。
安裝并設(shè)置好之后,要做的第一件事就是連接數(shù)據(jù)庫。PQconnectdb()函數(shù)帶一個(gè)char *conninfo格式的參數(shù),參數(shù)格式如dbname=[database_name],當(dāng)然也可以是其他內(nèi)容,只要格式對(duì)即可,最常用的關(guān)鍵字為host,hostaddr(numeric格式,以避免無用的DNS查詢),port,user,password與sslmode。如果不使用參數(shù),則會(huì)使用默認(rèn)選項(xiàng)。假設(shè)服務(wù)器地址為192.168.0.101,username為postgres,數(shù)據(jù)庫名為testdb1,嘗試連接數(shù)據(jù)庫的代碼如下所示:
#include #include int main(int argc,char argv[]){? ? const char *conninfo;? ? PGconn *conn;? ? if (argc > 1)? ?? ???conninfo = argc[1];? ? else? ? {? ?? ???printf("Not enough arguments, exiting...");? ?? ???return 1;? ? }? ? conn = PQconnectdb(conninfo);? ? /*Check to see how I did */? ? if(PQstatus(conn) = CONNECTION_OK)? ?? ???printf("Connection succeeded.n");? ? else? ? {? ?? ???/*Do something to deal with the error*/? ? }}
將代碼保存為testlibpq并編譯,編譯后的程序用法如下:
$ testlibpg "hostaddr=192.168.0.101 user=postgres dbname=testdb1"
如果不出錯(cuò)誤,會(huì)在屏幕上看到提示“Connection succeeded.”,表示連接數(shù)據(jù)庫成功,不過上文并沒有什么實(shí)際用處。那么何為實(shí)際用處呢----對(duì)數(shù)據(jù)進(jìn)行查詢,但這里先介紹如何斷開連接,即調(diào)用PQfinish,該函數(shù)只有一個(gè)參數(shù)PGconn *conn,并返回void。
PQexec函數(shù)執(zhí)行查詢,參數(shù)為PGconn *conn與const char *command,返回一個(gè)PGresult類型的對(duì)象。在如下示例中,聲明一個(gè)PGresult變量,并向服務(wù)器發(fā)送一個(gè)命令。讀者可自行編寫檢查連接與否以及錯(cuò)誤處理的代碼。
PGresult *res;? ?res = PQexec(conn, "SELECT * FROM mydatabase");? ?PQclear(res);
顯然這段代碼無法編譯,只是為了向讀者展示libpq庫提供的功能,而不是直接提供可用代碼。不過在這段代碼中,res包含了查詢結(jié)果,讀者可以任意對(duì)其進(jìn)行解析。PQresultStatus可以查詢命令的狀態(tài),該函數(shù)返回PGRES_COMMAND_OK或 PGRES_FATAL_ERROR.。可在PostgreSQL項(xiàng)目頁面找到exec函數(shù)的一個(gè)綜合列表。
下面介紹一些有用的函數(shù),例如,PQntuples函數(shù)將給定的res作為參數(shù),以整數(shù)類型返回表中列的數(shù)量。如果查詢的狀態(tài)為PGRES_TUPLES_OK,則它以PGresult對(duì)象為參數(shù),并返回一個(gè)整型值。PQnfields函數(shù)給出每行的列數(shù)。PQfname函數(shù)返回與某數(shù)字關(guān)聯(lián)的列的名字,PQfnumber函數(shù)功能則完全相反。要得到某一單元的值,需要將PGresult以及單元的列號(hào)和行號(hào)傳給PQgetvalue函數(shù)。
可以看到這些函數(shù)都比較簡單,但PQexec不能同時(shí)處理多個(gè)SQL命令,因?yàn)樵摵瘮?shù)只能返回一個(gè)結(jié)構(gòu),如果有多個(gè)命令,則只能返回最后一個(gè)命令的結(jié)果。另一個(gè)不足是,PQexec在執(zhí)行一個(gè)命令時(shí)會(huì)一直等到命令返回,因此讀者在使用該命令遇到阻塞執(zhí)行時(shí)要分外小心。如果這些不足影響到讀者用戶的使用,可以使用其它函數(shù)代替,如PQsendQuery和PQgetResult等,可使用這些函數(shù)來進(jìn)行異步查詢處理
總結(jié)
以上是生活随笔為你收集整理的postgresql c语言,任意语言访问PostgreSQL:C语言接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12306能删候补订单记录_「实用」官方
- 下一篇: win8 mysql6_Win8系统 M