任意語言訪問PostgreSQL C語言介面

2021-09-21 11:09:41 字數 2880 閱讀 3817

作為一名系統管理員,可能每天都要通過某段程式連線到資料庫。開源軟體的乙個好處是可以根據需要修改程式**。如果程式後台使用postgresql資料庫,可以很容易用各種語言對其進行訪問。本文作為系列文章的第一篇,會陸續介紹c、c++、php、tcl、python及perl等程式語言對postgresql的訪問方法。

需要說明的是,本文不太適合完全沒有程式設計經驗的讀者。不過只要讀者有基本的sql知識,以及懂得至少一種程式語言即可看懂。也許讀者正在使用的系統是linux,但是只要使用的客戶端api介面在其他系統可用,則程式**不需更改即可在其他作業系統上正常使用。本文所示的**全部基於postgre 9.1,是目前最新的穩定版本,已經安裝並經過測試。在本文的操作環境中,客戶端與服務端位於不同的計算機,但位於同一區域網內,這種情況下可以在客戶端通過命令gpsql -u postgre -h x.x.x.x很容易地連線到服務端。

首先要確保在客戶端機器上有安裝軟體的許可權,並且最好確保當前使用的資料庫只做當前測試用,以免任何因不小心的操作導致重要資料的損壞。

c語言介面

在與資料庫連線方面,c語言是一種常用語言,許多資料庫都是用c寫的。該語言高效靈活,因此如果想要寫一款客戶端介面,不管是僅僅包含控制台還是基於gui的,並且不想用到瀏覽器,c語言也許是最好的選擇。

連線c語言與postgres使用的庫名為libpq,它與postgresql原始碼樹繫結在一起。如果安裝資料庫系統時使用的是二進位制檔案而不是從原始碼編譯安裝,libpq可被單獨安裝,但也要記得需要使用選項-dev package(或-devel,取決於linux系統的版本)。在debian及其分發版上,安裝libpq的命令為 #aptitude install libpq-dev。在基於redhat的系統上,如centos,可以在postgresqlxx-libs包中找到libpq,其中xx為主要和次要版本號。因此要連線到postgresql 9.1資料庫,如果使用fedora16,則需要安裝postgresql91-lib或postgresql-devel。由於rhel/centos使用者大多使用postgres庫,導致程式的名稱可能會有一些不同,而且由於fedora使用者能夠使用更多最新的包,因此僅僅在使用乙個舊版本時才需要第三方庫。簡而言之,任何支援postgresql的系統均有其可用的libpq。

除了c語言,libpq同時也是c++、perl和tcl的api引擎,提供基本的函式對資料庫進行連線、查詢和修改。許多常用的函式都包含「pq」字首,如pqconnectdb或pqerrormessage。更多示例可檢視postgresql文件或檢視src/test/examples。在c程式檔案中,包含libpq-fe.h標頭檔案並在編譯時新增相應的鏈結標記-lpq。

安裝並設定好之後,要做的第一件事就是連線資料庫。pqconnectdb()函式帶乙個char *conninfo格式的引數,引數格式如dbname=[database_name],當然也可以是其他內容,只要格式對即可,最常用的關鍵字為host,hostaddr(numeric格式,以避免無用的dns查詢),port,user,password與sslmode。如果不使用引數,則會使用預設選項。假設伺服器位址為192.168.0.101,username為postgres,資料庫名為testdb1,嘗試連線資料庫的**如下所示:

#include

#include

int main(int argc,char ar**)

conn = pqconnectdb(conninfo);

/*check to see how i did */

if(pqstatus(conn) = connection_ok)

printf("connection succeeded.\n");

else

}將**儲存為testlibpq並編譯,編譯後的程式用法如下:

$ testlibpg "hostaddr=192.168.0.101 user=postgres dbname=testdb1"

如果不出錯誤,會在螢幕上看到提示「connection succeeded.」,表示連線資料庫成功,不過上文並沒有什麼實際用處。那麼何為實際用處呢----對資料進行查詢,但這裡先介紹如何斷開連線,即呼叫pqfinish,該函式只有乙個引數pgconn *conn,並返回void。

pqexec函式執行查詢,引數為pgconn *conn與const char *command,返回乙個pgresult型別的物件。在如下示例中,宣告乙個pgresult變數,並向伺服器傳送乙個命令。讀者可自行編寫檢查連線與否以及錯誤處理的**。

pgresult *res;

res = pqexec(conn, "select * from mydatabase");

pqclear(res);

顯然這段**無法編譯,只是為了向讀者展示libpq庫提供的功能,而不是直接提供可用**。不過在這段**中,res包含了查詢結果,讀者可以任意對其進行解析。pqresultstatus可以查詢命令的狀態,該函式返回pgres_command_ok或 pgres_fatal_error.。可在postgresql專案頁面找到exec函式的乙個綜合列表。

下面介紹一些有用的函式,例如,pqntuples函式將給定的res作為引數,以整數型別返回表中列的數量。如果查詢的狀態為pgres_tuples_ok,則它以pgresult物件為引數,並返回乙個整型值。pqnfields函式給出每行的列數。pqfname函式返回與某數字關聯的列的名字,pqfnumber函式功能則完全相反。要得到某一單元的值,需要將pgresult以及單元的列號和行號傳給pqgetvalue函式。

可以看到這些函式都比較簡單,但pqexec不能同時處理多個sql命令,因為該函式只能返回乙個結構,如果有多個命令,則只能返回最後乙個命令的結果。另乙個不足是,pqexec在執行乙個命令時會一直等到命令返回,因此讀者在使用該命令遇到阻塞執行時要分外小心。如果這些不足影響到讀者使用者的使用,可以使用其它函式代替,如pqsendquery和pqgetresult等,可使用這些函式來進行非同步查詢處理。

允許任意主機通過外網訪問mysql

root 任意主機 123456 密碼 flush privileges 重新整理mysql的系統許可權相關表 mysql的root賬戶,我在連線時通常用的是localhost或127.0.0.1,公司的測試伺服器上的mysql也是localhost所以我想訪問無法訪問,測試暫停.解決方法如下 1,...

3 設定主機名訪問任意主機

修改之前,只能通過 ip 進行訪問 admin xj0927 myfile ping 192.168.77.131 ping 192.168.77.131 192.168.77.131 56 84 bytes of data.64 bytes from 192.168.77.131 icmp seq...

C語言之任意進製的轉換

我們都知道轉換進製是乙個讓人比較頭疼的事情,下面我的 不是最好的,也就僅僅是乙個思路而已,至少我認為使用棧來進行進製轉換是比較合適的一種方法,好了,不多敘述了。include include 函式trans將無符號整數n翻譯成d 2 d 16 進製表示的字串s define m sizeof uns...