資料庫操作應是所有合格程式員的基本功,寫的一手好SQL對於數據分析師而言更是安身立命之本。大部分軟體開發人員使用的資料庫都是MySql/MariaDB,畢竟LAMP(linux+apache+mysql+php)曾經風靡一時。但開發人員真正的瑞士小軍刀卻是SQLite,它是世界上裝機量第一的嵌入式數... ...
資料庫操作應是所有合格程式員的基本功,寫的一手好SQL對於數據分析師而言更是安身立命之本。大部分軟體開發人員使用的資料庫都是MySql/MariaDB,畢竟LAMP(linux+apache+mysql+php)曾經風靡一時。但開發人員真正的瑞士小軍刀卻是SQLite,它是世界上裝機量第一的嵌入式資料庫。
SQLite最初的構思是在一條軍艦上進行的。當時在通用動力工作的SQLite的作者D.RichardHipp正在為美國海軍編製一種在導彈驅逐艦上使用的程式。那個程式最初運行在HewlettPackard UNX(HPUX)上,後臺使用Infomix資料庫。對那個具體應用而言Informix有點兒太強大了。一個有經驗的資料庫管理員安裝或升級Informix可能需要一整天。其實這個應用需要的只是一個自我包含的資料庫,它易使用並能由程式控制。2000年1月Hipp開始和一個同事討論關於創建一個簡單的嵌入式SQL資料庫的想法。這個資料庫將使用C語言開發,同時這個資料庫將不需要安裝和管理支持。
◆2000年8月SQlite1.0發佈。Hipp用B-tree替換了gdbm。
◆2004年SQlite從2.0升級到3.0。這個版本重點強化了國際化。程式體積繼續保持240KB。
SQLite對標的不是MySQL、Oracle這類C/S結構資料庫,而是文件系統。這樣的場景基本都是對資料庫高級特性(擴展、併發、許可權)沒什麼需求時方便使用的。
經典的應用場景如下:
◆嵌入式資料庫,開箱即用,sqlite資料庫本身很小(windows下只有4Mb左右,主流linux都自帶sqlite)。
◆數據量不多的情況下,如果系統只幾萬甚至幾千條數據時,用sqlite是最適合的。
◆app中使用sqlite做緩存數據的存放,如登陸數據緩存,歷史數據緩存等。
從2000年5月29日開始,SQLite就選擇了C語言。直到今天,C也是實現SQLite這樣軟體庫的最佳語言。
主要原因包括:
◆性能。像SQLite這樣被密集使用的基礎庫需要有很好的性能,因為它對標於文件系統、甚至於記憶體操作,C語言很適合寫這樣有性能要求的程式。C語言有時被稱為「攜帶型彙編語言」,讓開發者能儘可能的接近底層硬體編碼,同時保證跨平臺的便攜性。當然,也有其他的編程語言聲稱和C一樣快或者更快,但沒有一個能和C一樣通用。
◆相容性。目前幾乎所有的系統都可以調用由C語言編寫的庫。
◆低依賴性。用C來編寫庫不會在運行時有太多的依賴。在最小的配置下,SQLite只需要C標準庫里屈指可數的幾個函數。
◆穩定性。這個穩定性是指語言的穩定性。C語言相對老舊但非常成熟可靠,但卻正好很適合開發像SQLite這樣更註重長期穩定的模塊。
SQLite安裝極為簡單:
◆linux:不用安裝,直接在命令行下輸入sqlite3即可使用。
◆windows:訪問SQlite官網,從Windows區下載預編譯的二進位文件。需要下載sqlite-tools-win32-*.zip、sqlite-dll-win32-*.zip壓縮文件。創建文件夾C:\sqlite,併在此文件夾下解壓上面兩個壓縮文件,將得到sqlite3.def、sqlite3.dll和sqlite3.exe文件。添加C:\sqlite到PATH環境變數,最後在命令提示符下,使用sqlite3命令即可。
SQlite的使用也非常簡單,直接使用命令進行相關的操作。
# 創建資料庫 sqlite3 demo.db # 顯示資料庫 .database # 創建表 create table demo_table(id int,name text); # 插入數據 insert into demo_table values(1,"chen"); # 查詢 select * from demo_table; # 退出 .quit
如果不喜歡使用命令行工具,也可以使用IDE工具。在VSCODE中,有專用的擴展支持如下圖所示,非常方便。
sqlite的不足包括:
◆不支持right join,當然left join是完全可以替代的。
◆視圖(view)、觸發器(trigger)功能受限。
◆事務處理能力受限(相較MySQL中的4種隔離級別而言)。
◆安全性不高,不具有MySQL中詳細的許可權管理功能,甚至sqlite數據文件的訪問無需用戶名密碼。
◆支持的數據類型較少。SQLite原生支持5中數據類型:NULL、INTEGER、REAL、TEXT、BLOB。在SQLite中,所有數據最終都轉化為該5中類型進行存儲。在SQLite中不支持BOOLEAN,在存儲時,會將false轉換為0,true轉換為1。同時SQLite不支持Date和Time數據類型,但是內置提供了一些時間操作函數,幫助用於轉換為其他數據類型進行存儲。
◆不建議基於網路的資料庫訪問。SQLite通常是內置在應用程式中的。如果數據和應用程式是分離的,則訪問數據就需要訪問網路。這樣也是可行的,但不是最優選擇。當數據和應用程式是分開在不同的物理設備上時,通常不選擇SQLite。
◆不建議高併發時使用。
◆不建議用於大資料庫的場景,畢竟超過150T,SQLite是無法承受的。
然而,儘管sqlite在功能完整性方面並不足以與其他關係型資料庫相媲美,但考慮其拿來即用的特點,不失為程式員開發中的瑞士軍刀。