Sqlite簡介
sqlite是一個開源的嵌入式文件數據庫,sqlite以動態鏈接庫的方式供應用程序調用,所有的數據庫對象都存儲在同一個文件中。 sqlite動態庫非常小,最新的3.8.11版本也只有500k左右。sqlite雖然小,但功能並不弱,它支持sql-92標准中大部分SQL規范, 支持表,索引,視圖,觸發器等對象,同時它還支持事務,滿足ACID特性,因此非常適合嵌入式設備存儲數據,尤其是手機,君不見微信,支付寶其實都在用哦。鑒於sqlite在嵌入式 領域非常流行,本人最近也在學習這個數據庫,后面在學習的過程中,會整理些筆記,希望對大家有幫助。
下載源代碼
在sqlite官網上http://www.sqlite.com/download.html下載最新的源代碼,目前最新的版本是3.8.11。sqlite的源碼包有兩類,一類是sqlite-amalgamation-3081101.zip,這個包里面的 的源碼只有一個源碼文件sqlite3.c,包含了sqlite各個模塊的所有代碼;另外一類是sqlite-src-3081101.zip,這個包按sqlite模塊拆分成了很多小文件。如果你想學習源代碼,建議使用sqlite-src-3081101.zip,而如果用來熟悉sqlite功能,則建議使用sqlite-amalgamation-3081101.zip,因為就一個文件,方便將代碼整合到自己的工程。下文,都假設采用只有一個文件的包。
編譯&安裝
拿到源碼后,我們看到除了sqlite3.c源文件,還有shell.c文件。因為sqlite3.c只是一個動態庫的源文件,因此通過整合shell.c可以生成sqlite執行碼,簡單來說就是sqlite3的客戶端。
1) 編譯命令行管理工具
gcc shell.c sqlite3.c -lpthread -ldl -o sqlite3
2) 編譯動態鏈接庫
gcc sqlite3.c -lpthread -ldl -fPIC -shared -o libsqlite3.so
備注:
-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的,動態載入時是通過代碼拷貝的方式來滿足不同進程的需要, 這樣,N個進程就就需要N個動態庫的拷貝,不能達到真正代碼段共享的目的。
-shared:表示生成一個共享目標文件,即我們所說的動態鏈接庫。它可以和其他目標文件連接產生可執行文件。
-lpthread系統庫用於支持線程操作。
-dl系統庫用於支持動態裝載。
3) 編譯靜態庫
gcc -c sqlite3.c -lpthread -ldl -o sqlite3.o
ar -r libsqlite3.a sqlite3.o
將列出的各個目標文件一起打包成一個靜態庫libsqlite3.a
sqlite3基本操作
經過第一步和第二步,我們已經有了動態庫和可執行碼,這一節主要講講sqlite客戶端的基本操作。由於sqlite支持sql-92標准,因此,在sqlite中使用sql語句與其他關系型數據庫並沒有太多差別。
1) 創建名為test.db的數據庫
sqlite3 test.db
2) 創建表t,並添加索引idx_c1
create table t1(id int primary key, c1 varchar(100));
create index idx_c1 on t1(c1);
3) 創建視圖
create view view_t1 as select * from t1;
4) 元數據查詢命令
a) .databaes 顯示數據庫對象
b) .tables 顯示表對象
c) .schema 顯示表對象創建語句
d) .indices 顯示索引對象
5) sqlite_master元數據表
sqlite中所有數據都存儲在一個db文件中,其中sqlite_master用於存儲元數據信息。第4節講到的命令輸出的數據,實質都是來源於sqlite_master表。Sqlite_master表結構如下
| type |
name |
tbl_name |
rootpage |
sql |
| 對象類型 |
對象名 |
表名 |
對象B樹存儲的根頁 |
創建對象語句 |
比如,查詢當前數據庫的所有對象

6) .show 顯示格式
默認查詢輸出結果可能不太容易看,可以通過設置以下參數來調整輸出。.show命令顯示了當前各種輸出參數的設置,比如我們輸出結果時,需要輸出列名,可以使用.headers on即可。其他參數,大家可以逐個試試。
sqlite> .show
echo: off
explain: off
headers: on
mode: column
nullvalue: ""
output: stdout
separator: "|"
width:
7) 導入&導出
sqlite備份恢復相當容易,直接拷貝db文件就完事了。同樣sqlite也支持導入導出功能,相對於拷貝物理文件方式,導出的對象更靈活,可以只導出數據庫中的指定對象,另外導出文件存儲的是SQL語句,物理文件存儲的是二進制數據。
a) 導出
.dump 默認導出數據庫所有對象到屏幕

b) 導出 t1和t2表到文件,需要設置.output參數
.output filename
.dump t1 t2
.output stdout
c) 導入
.read filename
