本文介紹使用 C/C++ 結合數據庫自帶的 libpq 和 libPq++ 庫來開發 Linux 下有名的免費數據庫 PostgreSQL,詳細描述了怎樣使用開發庫來操作數據的步驟和流程。
PostgreSQL 是一種運行在Unix和Linux操作系統(在NT平臺借助Cygnus也可以運行)平臺上的免費的開放源碼的關系數據庫。最早是由美國加州大學伯克利分校開發的,開始只是作為一個演示系統發表,但是隨著時間的推移,逐步分發,得到很多實際的應用,才逐步流行起來?,F在版本發展到了7.3.3。
榮譽:
2.主要功能和特性
3.數據類型
PostgreSQL支持豐富的數據類型,許多數據類型在商業數據庫中都無法提供。
參數名稱 | 最大范圍 |
數據庫大小 | 無限制 |
表大小 | 16TB(所有系統) |
一條記錄大小 | 1.6GB |
字段大小 | 1GB |
表記錄條數 | 無限制 |
表字段數 | 250-1600(取決于字段的數據類型) |
表索引 | 無限制 |
事實上不可能存在無限制的情況。支持16TB大小的表不是單一文件保存,而是分為多個文件存儲的,所以不受限制于操作系統。
4.下載安裝
我們可以到 http://www.postgresql.org網站下載,具體怎么安裝我就不贅述,大家可以看文檔,也可以看 參考中的中文網站的文檔。在這里我就說說安裝中需要注意的幾個問題。
注意
|
5.常用命令
Createdb | 創建數據庫 |
Createuser | 創建數據庫用戶 |
Dropdb | 刪除數據庫 |
Dropuser | 刪除數據庫用戶 |
Psql | 交互式PostgreSQL前端工具,可以用它來操作數據庫 |
Initdb | 初始化postgreSQL數據庫 |
這里不是介紹怎樣使用PostgreSQL數據庫,所以對這些命令也不詳細解釋,可以參見文檔說明和幫助。我在這里是假設讀者已經安裝并初始化好了數據庫,并且會使用psql和熟練SQL來交互操作數據。
PostgreSQL提供很多不同語言的接口,有C、C++、Perl、Tcl等等,這里主要是介紹C/C++怎樣連接到數據庫,對數據進行添加,查詢等操作。
1.C語言接口
|
建立非阻塞連接函數
|
|
這里只列舉最常用的一些函數,具體說明可以參見文檔。
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文件中定義,具體使用參見 Aclearcase/" target="_blank" >ccessing Large Objects from libpq
上面函數的具體介紹請參見 PostgreSQL v7.0文檔 在這里就不詳細介紹了。這里省略列舉狀態檢查函數,參見參考文檔。
使用C語言訪問數據庫的除了libpq庫,還有其他如 libpqeasy,ecpg 等接口。
2.C++語言接口
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 |
以 postgres 用戶或者具有建立數據庫用戶權限的用戶登錄 Linux,先建立數據庫。
|
然后使用 psql 連接到數據庫
|
連接到數據庫建立表,如下圖所示
插入測試用數據,如圖:
(注意:psql中輸入SQL語句要以"; "結束才執行,幫助命令是"\\?",退出命令是"\\q")。
|
運行結果如圖所示
|
運行結果如圖所示
本文的樣例代碼: testC.c、 testC++.cpp。