SQLite安裝、編譯與應用


什么是 SQLite

       SQLite是一款輕量級的、基於文件的嵌入式數據庫,實現自包容、零配置、支持事務的SQL數據庫引擎。與其他數據庫管理系統不同,SQLite 的安裝和運行非常簡單,在大多數情況下,只要確保SQLite的二進制文件存在即可開始創建、連接和使用數據庫。第一個Alpha版本誕生於2000年5月,直到今天已經成為最流行的嵌入式數據庫,包括Google在內的許多公司在其桌面軟件中亦使用SQLite存儲用戶數據,由此看來,其穩定性毋庸置疑。

       實際應用中,SQLite作為目前最為流行的開源嵌入式關系型數據庫,在系統的架構設計中正扮演着越來越重要的角色。和很多其它嵌入式NoSQL數據庫(如BerkeleyDB、MemBASE等)不同的是,SQLite支持很多關系型數據庫的基本特征,如標准SQL語法、事務、數據表和索引等,這在數據移植、程序演示等應用中有着不可替代的優勢。從官方文檔中我們可以獲悉到,SQLite支持的數據量和運行效率都是非常驕人的,因此在海量數據的解決方案中,SQLite可以作為數據預計算的橋頭堡,從而顯著減少存儲在關系型數據庫服務器中的數據數量,最終提高系統的查詢效率和運行期效率,同時也可以顯著的降低數據備份的磁盤開銷。

SQLite的主要特征:
    1). 管理簡單,甚至可以認為無需管理。
    2). 操作方便,SQLite生成的數據庫文件可以在各個平台無縫移植。
    3). 可以非常方便的以多種形式嵌入到其他應用程序中,如靜態庫、動態庫等。
    4). 易於維護。

  綜上所述,SQLite的主要優勢在於靈巧、快速和可靠性高。SQLite的設計者們為了達到這一目標,在功能上作出了很多關鍵性的取舍,與此同時,也失去了一些對RDBMS關鍵性功能的支持,如高並發、細粒度訪問控制(如行級鎖)、豐富的內置函數、存儲過程和復雜的SQL語句等。正是因為這些功能的犧牲才換來了簡單,而簡單又換來了高效性和高可靠性。

SQLite的優勢

  ①   免配置。和Access一樣,只要把數據庫文件通過FTP上傳到服務器上即可使用,不需要服務器的額外支持。

  ②   備份方便。因為只是一個文件,只要復制一份該文件,就能備份整個數據庫。

  ③   雖然是輕量級數據庫。但最大能支持2TB 大小的單個庫文件。

  ④   速度快。在幾百萬條記錄的情況下,其插入和查詢速度與MySQL不分上下,快於SQL Server,10倍於Access(但這並不意味着它可以替代SQL Server)。

SQLite的主要優點

  1. 一致性的文件格式:
  在SQLite的官方文檔中是這樣解釋的,我們不要將SQLite與Oracle或PostgreSQL去比較,而是應該將它看做fopen和fwrite。與我們自定義格式的數據文件相比,SQLite不僅提供了很好的移植性,如大端小端、32/64位等平台相關問題,而且還提供了數據訪問的高效性,如基於某些信息建立索引,從而提高訪問或排序該類數據的性能,SQLite提供的事務功能,也是在操作普通文件時無法有效保證的。
  2. 在嵌入式或移動設備上的應用:
  由於SQLite在運行時占用的資源較少,而且無需任何管理開銷,因此對於PDA、智能手機等移動設備來說,SQLite的優勢毋庸置疑。
  3. 內部數據庫:
  在有些應用場景中,我們需要為插入到數據庫服務器中的數據進行數據過濾或數據清理,以保證最終插入到數據庫服務器中的數據有效性。有的時候,數據是否有效,不能通過單一一條記錄來進行判斷,而是需要和之前一小段時間的歷史數據進行特殊的計算,再通過計算的結果判斷當前的數據是否合法。在這種應用中,我們可以用SQLite緩沖這部分歷史數據。還有一種簡單的場景也適用於SQLite,即統計數據的預計算。比如我們正在運行數據實時采集的服務程序,我們可能需要將每10秒的數據匯總后,形成每小時的統計數據,該統計數據可以極大的減少用戶查詢時的數據量,從而大幅提高前端程序的查詢效率。在這種應用中,我們可以將1小時內的采集數據均緩存在SQLite中,在達到整點時,計算緩存數據后清空該數據。
  4. 數據分析:
  可以充分利用SQLite提供SQL特征,完成簡單的數據統計分析的功能。這一點是CSV文件無法比擬的。
  5. 產品Demo和測試:
  在需要給客戶進行Demo時,可以使用SQLite作為我們的后台數據庫,和其他關系型數據庫相比,使用SQLite減少了大量的系統部署時間。對於產品的功能性測試而言,SQLite也可以起到相同的作用。

和RDBMS相比,SQLite的劣勢 

  1. C/S應用:
  如果你有多個客戶端需要同時訪問數據庫中的數據,特別是他們之間的數據操作是需要通過網絡傳輸來完成的。在這種情況下,不應該選擇SQLite。由於SQLite的數據管理機制更多的依賴於OS的文件系統,因此在這種操作下其效率較低。
  2. 數據量較大:
  受限於操作系統的文件系統,在處理大數據量時,其效率較低。對於超大數據量的存儲,甚至不能提供支持。
  3. 高並發:
  由於SQLite僅僅提供了粒度很粗的數據鎖,如讀寫鎖,因此在每次加鎖操作中都會有大量的數據被鎖住,即使僅有極小部分的數據會被訪問。換句話說,我們可以認為SQLite只是提供了表級鎖,沒有提供行級鎖。在這種同步機制下,並發性能很難高效。

SQLite個性化特征

  1. 零配置:
  SQLite本身並不需要任何初始化配置文件,也沒有安裝和卸載的過程。當然也不存在服務器實例的啟動和停止。在使用的過程中,也無需創建用戶和划分權限。在系統出現災難時,如電源問題、主機問題等,對於SQLite而言,不需要做任何操作。
  2. 沒有獨立的服務器:
  和其他關系型數據庫不同的是,SQLite沒有單獨的服務器進程,以供客戶端程序訪問並提供相關的服務。SQLite作為一種嵌入式數據庫,其運行環境與主程序位於同一進程空間,因此它們之間的通信完全是進程內通信,而相比於進程間通信,其效率更高。然而需要特別指出的是,該種結構在實際運行時確實存在保護性較差的問題,比如此時,應用程序出現問題導致進程崩潰,由於SQLite與其所依賴的進程位於同一進程空間,那么此時SQLite也將隨之退出。但是對於獨立的服務器進程,則不會有此問題,它們將在密閉性更好的環境下完成它們的工作。
  3. 單一磁盤文件:
  SQLite的數據庫被存放在文件系統的單一磁盤文件內,只要有權限便可隨意訪問和拷貝,這樣帶來的主要好處是便於攜帶和共享。其他的數據庫引擎,基本都會將數據庫存放在一個磁盤目錄下,然后由該目錄下的一組文件構成該數據庫的數據文件。盡管我們可以直接訪問這些文件,但是我們的程序卻無法操作它們,只有數據庫實例進程才可以做到。這樣的好處是帶來了更高的安全性和更好的性能,但是也付出了安裝和維護復雜的代價。
  4. 平台無關性:
  這一點在前面已經解釋過了。和SQLite相比,很多數據庫引擎在備份數據時不能通過該方式直接備份,只能通過數據庫系統提供的各種dump和restore工具,將數據庫中的數據先導出到本地文件中,之后在load到目標數據庫中。這種方式存在顯而易見的效率問題,首先需要導出到另外一個文件,如果數據量較大,導出的過程將會比較耗時。然而這只是該操作的一小部分,因為數據導入往往需要更多的時間。數據在導入時需要很多的驗證過程,在存儲時,也並非簡簡單單的順序存儲,而是需要按照一定的數據結構、算法和策略存放在不同的文件位置。因此和直接拷貝數據庫文件相比,其性能是非常拙劣的。
  5. 弱類型:
  和大多數支持靜態類型的數據庫不同的是,SQLite中的數據類型被視為數值的一個屬性。因此對於一個數據表列而言,即便在聲明該表時給出了該列的類型,我們在插入數據時仍然可以插入任意類型,比如Integer的列被存入字符串'hello'。針對該特征唯一的例外是整型的主鍵列,對於此種情況,我們只能在該列中存儲整型數據。
  6. SQL語句編譯成虛擬機代碼:
    很多數據庫產品會將SQL語句解析成復雜的,相互嵌套的數據結構,之后再交予執行器遍歷該數據結構完成指定的操作。相比於此,SQLite會將SQL語句先編譯成字節碼,之后再交由其自帶的虛擬機去執行。該方式提供了更好的性能和更出色的調試能力。

SQLite安裝

SQLite on Windows

1)進入 SQL 下載頁面:http://www.sqlite.org/download.html

2)下載 Windows 下的預編譯二進制文件包:

sqlite-shell-win32-x86-<build#>.zip
sqlite-dll-win32-x86-<build#>.zip

(注意: <build#> 是 sqlite 的編譯版本號)

  • 下載 sqlite-shell-win32-*.zip 和 sqlite-dll-win32-*.zip 壓縮文件。
  • 創建文件夾sqlite,並在此文件夾下解壓上面兩個壓縮文件,將得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件。
  • 添加sqlite 到 PATH 環境變量,以方便在命令行中執行 sqlite 命令。

 可選: 如果你計划發布基於 sqlite 數據庫的應用程序,你還需要下載源碼以便編譯和利用其 API。

sqlite-amalgamation-<build#>.zip

SQLite源碼下載

在SQLITE主頁https://www.sqlite.org/download.html下載源碼,選擇出現以下字樣的ZIP文件進行下載。

SQLite編譯

    若要編譯SQLite庫,需要下載單一文件版本sqlite-amalgamation-3071400.zip。它把sqlite3庫的所有源碼文件內容放到一個文件sqlite3.c中了(不包含管理工具shell.c),這個文件大概有110000多行,如果除去空白行和注釋,則有65000多行的代碼!這樣做的好處是很容易應用在你的項目中,只需拷貝這一個源文件到你項目中即可。另外,編譯器在編譯單一的文件時能做一些額外的優化,因為只有一個編譯單元。通過測試發現大概有5%-10%的性能提升。
    SQLite庫可以不編譯,直接把單一文件sqlite3.c(或者再加上sqlite3.h)拷貝到你的項目中使用即可。但作為一個單獨的庫,一般建議編譯成獨立的二進制文件格式的庫,如Linux下的.so動態鏈接庫,Windows下的DLL動態鏈接庫,然后在項目中通過頭文件sqlite3.h來使用這個庫,這樣能使軟件更加地模塊化。

SQLite3源碼在Linux下編譯

(1)編譯命令行管理工具:gcc shell.c sqlite3.c -lpthread -ldl -o sqlite3  //將生成sqlit3命令行管理工具
   
(2)編譯SQLite為單獨的動態鏈接庫:gcc sqlite3.c -lpthread -ldl -fPIC -shared -o libsqlite3.so    
    -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

    -shared:表示生成一個共享目標文件(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),即我們所說的動態鏈接庫。它可以和其他目標文件連接產生可執行文件。只有部分系統支持該選項。

    pthread系統庫用於確保SQLite是線程安全的。但因為命令行工具是單線程的,對命令行工具則可編譯成非線程安全的,以忽略pthread庫。命令為gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -o sqlite3。dl系統庫用於支持動態裝載,sqlite3_load_extension()接口和SQL函數load_extension()需要用到它。如果不需要這些特性,可以使用SQLITE_OMIT_LOAD_EXTENSION編譯選項來忽略,如gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3。

    使用動態庫libsqlite3.so:在你的程序中(例如test.c)通過包含頭文件sqlite3.h來使用庫中的函數,編譯程序的命令為gcc test.c -L. -lsqlite3 -o test。其中-L.表示讓鏈接庫的搜索路徑包含當前目錄,-lsqlite3指明編譯器查找動態庫libsqlite3.so,編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱。通過ldd test可查看test程序是如何調用動態庫中的函數的。

    調用動態庫時有幾個問題會經常碰到。有時明明已經將庫的頭文件所在目錄通過 “-I” include進來了,庫所在文件通過 “-L”參數引導,並指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定鏈接的so文件,這時你要作的就是修改LD_LIBRARY_PATH,這個環境變量指示動態連接器可以裝載動態庫的路徑。或者修改/etc/ld.so.conf文件,然后調用/sbin/ldconfig來達到同樣的目的。通常這樣做就可以解決庫無法鏈接的問題了。


(3)編譯成靜態庫:gcc -c sqlite3.c -lpthread -ldl -o sqlite3.o  //編譯成目標文件
             ar -r libsqlite3.a sqlite3.o  //將列出的各個目標文件一起打包成一個靜態庫libsqlite3.a

    鏈接靜態庫:gcc test.c -L. -lsqlite3 -static -o test  //也可不加-static選項

SQLite3源碼在Windows平台編譯

工具:Visual Studio 2010

(1)把SQLite編譯成動態鏈接庫:
    打開Visual Studio 2010,新建一個名為sqlite3的Visual C++ Win32工程,在工程向導頁中選擇工程的類型為 "DLL", 並且把創建為空項目的復選框鈎上。通過工程--->添加現有項...,把單一文件sqlite3.c添加到工程中。為了生成在鏈接sqlite3.dll時需要用到的lib文件,需要在工程中添加模塊定義文件。根據sqlite3.h中列出的導出函數名,我們可以自己寫.def文件,例如:
EXPORTS
sqlite3_aggregate_context
sqlite3_aggregate_count
sqlite3_auto_extension
sqlite3_backup_finish
sqlite3_backup_init
sqlite3_backup_pagecount
sqlite3_backup_remaining
sqlite3_backup_step
sqlite3_bind_blob
sqlite3_bind_double
;......
    也可以使用已寫好的.def文件,下載已編譯好的SQLite DLL庫sqlite-dll-win32-x86-3071400.zip,里面有sqlite3.def,把它拷貝到我們的sqlite3項目中,在工程屬性的Linker--->Input--->Module Definition File中輸入sqlite3.def。設置項目編譯成Release版本,編譯后生成sqlite3.dll和sqlite3.lib。
    編譯命令行管理工具:如果想編譯出sqlite.exe命令行程序,則需要創建一個空的Win32 控制台程序,然后在往工程里添加文件sqlite3.c和shell.c,直接編譯即可。

    使用動態鏈接庫sqlite3.dll

    新建一個空項目test,把sqlite3.dll, sqlite3.lib, sqlite3.h拷貝到項目目錄下,把sqlite3.h添加到項目中。新建主程序源文件test.cpp,如下:

#include <stdio.h>  
#include "sqlite3.h"  
#pragma comment(lib,"sqlite3")  
  
/* print a record from table outputed by sql statement */  
static int callback(void *NotUsed, int argc, char **argv, char **azColName){  
    int i;  
    for(i=0; i<argc; i++){  
        printf("%s = %s\n", azColName[i], argv[i]?argv[i]:"NULL");  
    }  
    printf("\n");  
    return 0;  
}  
  
int main(int argc, char **argv){  
    sqlite3 *db;  
    char *zErrMsg=0;  
    int rc;  
  
    if(argc!=3){  
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);  
        return(1);  
    }  
    rc=sqlite3_open(argv[1],&db);  /* open database */  
    if(rc){  
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));  
        sqlite3_close(db);  
        return(1);  
    }  
    rc=sqlite3_exec(db,argv[2],callback,0,&zErrMsg);  /* execute SQL statement */  
    if(rc!=SQLITE_OK){  
        fprintf(stderr,"SQL error: %s\n",zErrMsg);  
        sqlite3_free(zErrMsg);  
    }  
    sqlite3_close(db);  /* close database */  
    return 0;  
}  

    編譯后生成test.exe程序,它的運行依賴於sqlite3.dll。注意程序中也可以不使用pragma指令導入sqlite3.lib,而是在test項目屬性中添加對上面的dll項目sqlit3的引用。
    這個C程序的例子顯示怎么使用sqlite的C/C++接口。數據庫的名字由第一個參數取得,第二個參數是一條或更多的SQL執行語句。這個程序調用sqlite3_open()打開指定的數據庫,調用sqlite3_exec()對數據庫執行SQL語句,callback函數會作用在SQL語句結果集的每條記錄上。最后用sqlite3_close()關閉數據庫連接。可以用前面的alf.db數據庫來測試:test.exe alf.db "select * from mytable"。
    (2)把SQLite編譯成靜態鏈接庫:
    新建一個名為sqlite3static,空的Visual C++ Win32工程,在工程向導頁中選擇工程的類型為 "Static library",去年"Precompiled header"復選框,導入源文件sqlite3.c,編譯生成sqlite3static.lib,這是靜態鏈接庫版本,它要比動態鏈接庫sqlite3.dll大的多。
    使用靜態鏈接庫:
    新建一個空項目sqlite3statictest,添加對項目sqlite3static的引用,同樣使用上面的test.cpp,編譯生成sqlite3statictest.exe。可以發現它是一個獨立的可執行文件,不依賴靜態鏈接庫,刪除靜態鏈接庫后仍然可以運行。
    實際上,靜態鏈接庫不存在導出的概念,在鏈接過程中,靜態鏈接庫LIB中的指令都全部被直接包含在最終生成的EXE文件中了,因此如果用的是靜態鏈接庫,那么也就不存在“導出某個函數提供給用戶使用”的情況。對於使用該靜態庫的EXE文件來說,直接使用LIB中的函數和全局變量即可,而不管它們有沒有導出聲明。另外一點在使用中需要注意的是:靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含。

工具:VC++6.0

 需要從SQLite官網下載源代碼

  sqlite-amalgamation-*.zip

  sqlite-dll-win32-x86-*.zip

  sqlite-src-*.zip

  sqlite-preprocessed-*.zip

 1、  編譯成Win32下的應用程序(*.exe),用於命令行模式下的調試

  (1)啟動VC++6.0,創建一個Win32 Console Application空的工程,工程名為“SQlite”;

  (2)將sqlite-amalgamation-*.zip 解壓后的shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h添加到工程中,直接編譯即可生成sqlite.exe,可以在命令提示符下進行測試。

      

 編譯時,出現以下錯誤:unresolved external symbol __beginthreadex
            unresolved external symbol __endthreadex

 這是在使用MFC的類時出現連接錯誤。

 解決方法:

 1.工程右鍵——>“Project”菜單——〉“Setting”菜單項——〉General選項卡,在Microsoft Fountion Classes:中選擇:Use MFC in Static Library。
 2.再在C/C++選項卡中的在Category中選擇Code Generation,再在Use run-time library中選擇Debug Multithreaded(若在Win32 Debug環境下)或者multithreaded。

 其中:
  Single-Threaded單線程靜態鏈接庫(release版本)
  Multithreaded多線程靜態鏈接庫(release版本)
  multithreaded DLL多線程動態鏈接庫(release版本)
  Debug Single-Threaded單線程靜態鏈接庫(debug版本)
  Debug Multithreaded多線程靜態鏈接庫(debug版本)
  Debug Multithreaded DLL多線程動態鏈接庫(debug版本)

   2、編譯生成Win32平台下的動態鏈接庫(*.dll)。

    (1)啟動VC++6.0,創建一個Win32 Dynamic_Link Library,選擇一個空的DLL工程,工程名為“SQLite_Win32_DLL”;

  (2)將sqlite-amalgamation-*.zip解壓后的sqlite3.c、sqlite3.h、sqlite3ext.h以及sqlite-dll-win32-x86-*.zip解壓后的sqlite3.def模塊定義文件一起添加到工程中;

         

 (3)【Project】->【Settings…】->【C/C++】->【Category】->【General】->【Preprocessor definitions】

    新增編譯選項:SQLITE_ENABLE_COLUMN_METADATA,編譯通過即可生成dll。

    

 但此時只生成了sqlite_win32_dll.dll文件,沒有生成對應的引入庫(sqlite_win32_dll.lib)文件。

 具體方法是如下:

 修改sqlite3.c文件中的SQLITE_API宏定義,將“# define SQLITE_API”修改成“# define SQLITE_API __declspec(dllexport)”。

 

 或者直接把sqlite3.def添加在Linker--->Input--->Module Definition File中。

 

 再重新編譯即可生成sqlite_win32_dll.dll和sqlite_win32_dll.lib。

SQLite應用

   使用命令行工具我們可以完成大多數常用的SQLite操作,就像sqlplus之於Oracle。下表介紹了該工具的內置命令:

命令名 命令說明
.help                  列出所有內置命令。
.backup DBNAME FILE 備份指定的數據庫到指定的文件,缺省為當前連接的main數據庫。
.databases 列出當前連接中所有attached數據庫名和文件名。
.dump TABLENAME ... 以SQL文本的格式DUMP當前連接的main數據庫,如果指定了表名,則只是DUMP和表名匹配的數據表。參數TABLENAME支持LIKE表達式支持的通配符。
.echo ON|OFF 打開或關閉顯示輸出。
.exit 退出當前程序。
.explain ON|OFF 打開或關閉當前連接的SELECT輸出到Human Readable形式。
.header(s) ON|OFF 在顯示SELECT結果時,是否顯示列的標題。
.import FILE TABLE 導入指定文件的數據到指定表。
.indices TABLENAME 顯示所有索引的名字,如果指定表名,則僅僅顯示匹配該表名的數據表的索引,參數TABLENAME支持LIKE表達式支持的通配符。
.log FILE|off  打開或關閉日志功能,FILE可以為標准輸出stdout,或標准錯誤輸出stderr。
.mode MODE TABLENAME 設置輸出模式,這里最為常用的模式是column模式,使SELECT輸出列左對齊顯示。
.nullvalue STRING  使用指定的字符串代替NULL值的顯示。
.output FILENAME  將當前命令的所有輸出重定向到指定的文件。
.output stdout  將當前命令的所有輸出重定向到標准輸出(屏幕)。
.quit  退出當前程序。 
.read FILENAME  執行指定文件內的SQL語句。
.restore DBNAME FILE  從指定的文件還原數據庫,缺省為main數據庫,此時也可以指定其它數據庫名,被指定的數據庫成為當前連接的attached數據庫。
.schema TABLENAME 顯示數據表的創建語句,如果指定表名,則僅僅顯示匹配該表名的數據表創建語句,參數TABLENAME支持LIKE表達式支持的通配符。
.separator STRING 改變輸出模式和.import的字段間分隔符。
.show 顯示各種設置的當前值。
.tables TABLENAME 列出當前連接中main數據庫的所有表名,如果指定表名,則僅僅顯示匹配該表名的數據表名稱,參數TABLENAME支持LIKE表達式支持的通配符。
.width NUM1 NUM2 ... 在MODE為column時,設置各個字段的寬度,注意:該命令的參數順序表示字段輸出的順序。

打開cmd,輸入sqlite3

\

①  創建SQLite 數據庫

現在你已經安裝了 SQLite 數據庫,接下來我們創建首個數據庫。在命令行窗口中輸入如下命令來創建一個名為 test.db 的數據庫。

  1.  sqlite3 test.db 

②  創建表

  1.  sqlite> createtable mytable(id integerprimarykey, value text);  
  2.  2 columns were created.  

該表包含一個名為 id 的主鍵字段和一個名為 value 的文本字段。

注意: 最少必須為新建的數據庫創建一個表或者視圖,這么才能將數據庫保存到磁盤中,否則數據庫不會被創建。

接下來往表里中寫入一些數據。

③  插入數據

  1. sqlite> insertinto mytable(id, value) values(1, 'Micheal');  
  2. sqlite> insertinto mytable(id, value) values(2, 'Jenny');  
  3. sqlite> insertinto mytable(value) values('Francis');  
  4. sqlite> insertinto mytable(value) values('Kerk'); 

④  查詢數據

  1. sqlite> select * from test;  
  2. 1|Micheal  
  3. 2|Jenny  
  4. 3|Francis  
  5. 4|Kerk 

⑤  設置格式化查詢結果

  1.  sqlite> .mode column;  
  2.  sqlite> .header on;  
  3.  sqlite> select * from test;  
  4.  id          value  
  5.  ----------- -------------  
  6.  1           Micheal  
  7.  2           Jenny  
  8.  3           Francis  
  9.  4           Kerk 

.mode column 將設置為列顯示模式,.header 將顯示列名。

⑥  修改表結構,增加列

  1.  sqlite> alter table mytable add column email text not null '' collate nocase;; 

⑦  創建視圖

  1.  sqlite> create view nameview as select * from mytable; 

⑧  創建索引

  1. sqlite> create index test_idx on mytable(value); 

⑨  其他 SQLite 命令

顯示表結構:

  1. sqlite> .schema [table

獲取所有表和視圖:

  1. sqlite > .tables 

獲取指定表的索引列表:

  1. sqlite > .indices [table ] 

導出數據庫到 SQL 文件:

  1.  sqlite > .output [filename ]  
  2.  sqlite > .dump  
  3.  sqlite > .output stdout 

從 SQL 文件導入數據庫:

  1.  sqlite > .read [filename ] 

格式化輸出數據到 CSV 格式:

  1.  sqlite >.output [filename.csv ]  
  2.  sqlite >.separator ,  
  3.  sqlite > select * from test;  
  4.  sqlite >.output stdout 

從 CSV 文件導入數據到表中:

  1.  sqlite >createtable newtable ( id integerprimarykey, value text );  
  2.  sqlite >.import [filename.csv ] newtable 

備份數據庫:

  1.  /* usage: sqlite3 [database] .dump > [filename] */  
  2.  sqlite3 mytable.db .dump > backup.sql 

恢復數據庫:

  1.   /* usage: sqlite3 [database ] < [filename ] */  
  2.   sqlite3 mytable.db < backup.sql 

多線程環境中使用SQLite
    SQLite支持三種不同的線程模式:
    * 單線程。在這種模式下所有的互斥鎖都被禁用,在多個線程中同時使用SQLite時是不安全的。
    * 多線程。在這種模式下,只要沒有單個數據庫連接被同時用在多個線程中的情況,SQLite就可以在多線程環境中安全地使用。
    * 串行化。在這種模式中,SQLite可以無限制地在多線程環境中安全地使用。
    線程模式可以在編譯時(把SQLite源代碼編譯成庫時)、啟動時(使用SQLite的應用程序初始化時)或運行時(一個新的SQLite數據庫連接創建時)指定。一般來說,運行時參數會覆蓋掉啟動時參數,啟動時參數會覆蓋掉編譯時參數,但是單線程模式一旦被指定后,就不能被覆蓋。默認的模式是串行模式。
    (1)編譯時的線程模式選項
    通過SQLITE_THREADSAFE編譯時參數來選擇線程模式。如果沒有指定SQLITE_THREADSAFE參數,則使用串行化模式。也可以顯式地使用-DSQLITE_THREADSAFE=1來指定串行化模式。-DSQLITE_THREADSAFE=0表示單線程模式,-DSQLITE_THREADSAFE=2表示多線程模式。
    sqlite3_threadsafe()接口的返回值由編譯時線程模式選項來確定。如果編譯時指定單線程模式,則sqlite3_threadsafe()返回false。如果指定多線程模式或串行化模式,則sqlite3_threadsafe()返回true。sqlite3_threadsafe()不能區分多線程模式和串行化模式,也不能報告啟動時或運行時的模式更改。
    如果編譯時指定單線程模式,則編譯庫時關鍵的互斥邏輯會被忽略,因此不可能在啟動時或運行不可能再激活多線程或串行化模式。
    (2)啟動時的線程模式選項
    如果編譯時沒有指定單線程模式,則在使用sqlite3_config()接口進行初始化時可以改變線程模式。SQLITE_CONFIG_SINGLETHREAD謂詞把SQLite設置成單線程模式,SQLITE_CONFIG_MULTITHREAD設置多線程模式,SQLITE_CONFIG_SERIALIZED設置串行化模式。
    (3)運行時的線程模式選項
    如果編譯時或啟動時沒有指定單線程模式,則單個數據連接可以被創建為多線程或串行化模式,不可能將單個數據庫連接降級為單線程模式。如果編譯時或啟動時指定單線程模式,則不可能將單個數據庫連接升級為多線程或串行化模式。
    單個數據庫連接的線程模式由sqlite3_open_v2()的第三個參數給定的標志來確定。SQLITE_OPEN_NOMUTEX標志表示數據庫連接為多線程模式,SQLITE_OPEN_FULLMUTEX表示該連接為串行化模式。如果沒有指定標志,或者使用sqlite3_open(), sqlite3_open16(),而不是sqlite3_open_v2(),則使用編譯時或啟動時指定的線程模式。


免責聲明!

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



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