Sqlite學習筆記(一)&&編譯安裝


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

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM