2007年7月17日 星期二

[轉]SQLite 用法(一)--安裝編譯使用

[本文轉載來源為:http://blog.csdn.net/zieckey/archive/2006/05/04/707507.aspx]
作者: zieckey ( zieckey@yahoo.com.cn )

第一章 從這裡開始
1.0 引言
最近發現網上很多人在文 sqlite 數據庫的問題,可是解答的人並不多。於是萌生了寫點這方面的文章的念頭。雖然我也是剛接觸 sqlite 不到半年,對其瞭解得也不是很深很透徹,但是寫點東西讓初學者能夠很快上手,也算是我的心願之一。也許很多高手會覺得我這是班門弄斧,但是我還是想寫點關於 sqlite 的基本知識,這樣也許能給予某些人一些幫助,希望如此。

下文介紹的內容都是基於 Linux RedHat 9.0 平台的。

1.1 sqlite簡介
sqlite是嵌入式SQL數據庫引擎SQLite(SQLite Embeddable SQL Database Engine)的一個擴展。SQLite是一個實現嵌入式SQL數據庫引擎小型C語言庫(C library),實現了獨立的,可嵌入的,零配置的SQL數據庫引擎。特性包括:事務操作是原子,一致,孤立,並且持久的,即使在系統崩潰和電源故障之後。 零配置——不需要安裝和管理。 實現了絕大多數SQL92標準。整個數據庫存儲在一個單一的文件中。數據庫文件可以在不同字節序的機器之間自由地共享。支持最大可達2T的數據庫。字符串和BLOB類型的大小只受限於可用內存。完整配置的少於250KB,忽略一些可選特性的少於150KB。在大多數常見操作上比流行的客戶/服務器數據庫引擎更快。 簡單易於使用的API。 內建TCL綁定。 另外提供可用於許多其他語言的綁定。具有良好註釋的源代碼,代碼95%有較好的註釋。 獨立:沒有外部依賴。 源代碼位於公共域,可用於任何用途。用SQLite連接的程序可以使用SQL數據庫,但不需要運行一個單獨的關係型數據庫管理系統進程(separate RDBMS process)。SQLite不是一個用於連接到大型數據庫服務器(big database server)的客戶端庫(client library),而是非常適合桌面程序和小型網站的數據庫服務器。SQLite直接讀寫(reads and writes directly)在硬盤上的數據庫文件。
這一章告訴你怎麼開始體驗 SQLite ,這裡沒有長長的說明和冗煩的配置。

1.2 下載代碼
取得一份二進制拷貝, 或者是源代碼並自己編譯它。關於這個可以到 http://www.sqlite.org/的下載頁面獲得更多信。
這裡我就不多說了。

1.3 安裝
請閱讀在安裝包裡的 INSTALL 文件。或者使用PEAR installer with "pear install sqlite"。SQLite已經內置了,你不需要安裝任何附加的軟件(additional software)。
Windows users可以下載SQLite擴展DLL(php_sqlite.dl)。
這裡簡單介紹一下:
假設你得到的是源代碼,這裡將告訴你怎麼編譯它。
解壓sqlite-3.0.8.tar.gz 到 /home目錄下
For example:

# tar xzf sqlite.tar.gz –C /home/ ;# Unpack the source tree into "sqlite"
# mkdir sqlite-pc ;# Build will occur in a sibling directory
# cd sqlite-pc ;# Change to the build directory
# ../sqlite/configure ;# Run the configure script
# make ;# Run the makefile.
# make install
生成幫助文檔
# make doc

如果一切順利的話,sqlite的庫文件將會生成在 /usr/local/lib 目錄下。去看看有沒有這些庫文件。
libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig
好了我們可以進入下一節了。激動人心的時刻到了,我們可以輕而易舉的創建和操縱數據庫了。

1.4 創建一個新數據庫
在 shell 命令行下, 輸入: "sqlite3 zieckey.db"。 將創建一個新的數據庫文件名叫"zieckey.db". (當然你可以使用不同的名字)
輸入 SQL 命令在提示符下創建和寫入新的數據。
例如,新建一個名為zieckey.db的數據庫,並創建一個名為 SensorData 的表,其包含兩個列元素,並插入具體列元素,具體如下
# sqlite3 zieckey.db
SQLite version 3.0.8
Enter ".help" for instructions
sqlite> create table SensorData(one varchar(10), two smallint);
sqlite> insert into SensorData values('hello!',10);
sqlite> insert into SensorData values('goodbye', 20);
sqlite> select * from SensorData;
hello!10
goodbye20
sqlite>
安全退出 sqlite 的方法是
sqlite> .quit
這樣剛才的操作就保存下來了,如果強行退出有可能丟失剛才對數據庫的操作。
是不是相當容易,呵呵,當然拉!如果你會 SQL 語言,你會發現,sqlite的語法幾乎和它一個樣。
這裡先到這裡,後面的章節中我們會繼續學習sqlite的語法規則的。
1.5 寫個C語言程序調用SQLite
現在我們來寫個C/C++程序,調用 sqlite 的 API 接口函數。
下面是一個C程序的例子,顯示怎麼使用 sqlite 的 C/C++ 接口. 這個函數調用sqlite3_open() 在 22 行打開數據庫, sqlite3_exec() 在 27 行執行 SQL 命令, 並且sqlite3_close() 在 31 行關閉數據庫連接。
代碼:

// name: opendbsqlite.c
// This file is used to test C/C++ API for sqlite
// Author : zieckey
// 2006/04/11
#include
#include

int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("zieckey.db", &db); //打開指定的數據庫文件,如果不存在將創建一個同名的數據庫文件
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else printf("open zieckey.db successfully!\n");

sqlite3_close(db); //關閉數據庫
return 0;
}

編譯:# gcc opendbsqlite.c -o db.out
也許會碰到類似這樣的問題:
/tmp/ccTkItnN.o(.text+0x2b): In function `main':
: undefined reference to `sqlite3_open'
/tmp/ccTkItnN.o(.text+0x45): In function `main':
: undefined reference to `sqlite3_errmsg'
/tmp/ccTkItnN.o(.text+0x67): In function `main':
: undefined reference to `sqlite3_close'
/tmp/ccTkItnN.o(.text+0x8f): In function `main':
: undefined reference to `sqlite3_close'
collect2: ld returned 1 exit status

這是個沒有找到庫文件的問題。
由於用到了用戶自己的庫文件,所用應該指明所用到的庫,我們可以這樣編譯:

# gcc opendbsqlite.c -o db.out -lsqlite3

我用用 -lsqlite3 選項就可以了(前面我們生成的庫文件是 libsqlite3.so.0.8.6 等,
去掉前面的lib和後面的版本標誌,就剩下 sqlite3 了所以是 -lsqlite3 )。
如果我們在編譯安裝的時候,選擇了安裝路徑,例如這樣的話:
.......
# ../sqlite/configure --prefix=/usr/local/arm-linux/sqlite-ix86-linux
.......
這樣編譯安裝時,sqlite的庫文件將會生成在 /usr/local/arm-linux/sqlite-ix86-linux/lib 目錄下
這時編譯還要指定庫文件路徑,因為系統默認的路徑沒有包含 /usr/local/arm-linux/sqlite-ix86-linux/lib

# gcc opendbsqlite.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib

如果還不行的話,可能還需要指定頭文件 sqlite3.h 的路徑,如下:

# gcc opendbsqlite.c -lsqlite3 -L/usr/local/arm-linux/sqlite-ix86-linux/lib -I/usr/local/arm-linux/sqlite-ix86-linux/include

這樣編譯應該就可以了 ,運行:
# ./db.out
./db.out: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
運行是也許會出現類似上面的錯誤。
這個問題是由於運行沿著系統默認路徑沒有找到庫文件引起的。這時需要指定 libsqlite3.so.0 庫文件的路徑。
在shell下輸入:
export LD_LIBRARY_PATH=/usr/local/arm-linux/sqlite-ix86-linux/lib:$LD_LIBRARY_PATH
再運行
# ./db.out
open zieckey.db successfully!
是不是很有成就感阿 ,呵呵,這個上手還是很快的。


總結:這一章裡,我們瞭解了sqlite的基本概貌,並且知道了怎麼創建數據庫,
怎麼向數據庫中插入表格,向表格中插入數據,更令人興奮的是我們知道了
怎麼在C/C++中調用 sqlite 的 API 函數。
寫後感:這是我第一次這樣用心的比較正規的寫關於一個專題的文章。
我也是望著篇文章能帶給你幫助。如果是這樣的話,那我的努力就沒有白費,這讓我覺得我還做了點好事的。
本文一定存在很多不妥或者錯誤之處,還勞煩各位不吝賜教指正。在此跟貼,或者發 email :zieckey@yahoo.com.cn ,本人將不勝感激。
作者鄭重申明:本文可以自由轉載,但請不要去掉版權信息,也不要用於商業用途。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=707507

沒有留言: