SQLite是一款輕型的資料庫,它的設計目標是嵌入式的,而且目前已經在許多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式設備中,可能只需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言結合,例如Tcl、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的資料庫管理系統來講,它的處理速度比他們都快。
SQLite雖然很小巧,但支援的SQL語句不會遜色於其他開源資料庫,它支援的SQL包括:
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE
同時它也支援事務處理功能等等。也有人說它像Microsoft的Access,有時候真的覺得有點象,但事實上它們差別很大。例如SQLite支援跨平台,操作簡單,能夠使用很多語言直接建立資料庫,而不像Access一樣需要Office的支援。如果你是個很小型的應用,或者你想做嵌入式開發,沒有合適的資料庫系統,那麼現在你可以考慮使用SQLite。目前它的最新版本是3.2.2,它的官方網站是: http://www.sqlite.org ,能在上面取得原始碼和文件。同時因為資料庫結構簡單,系統原始碼也不多,也適合想研究資料庫系統開發的專業人士。
現在我們開始簡單的介紹,主要我是想講清楚幾個問題,一是如何安裝使用,二是如何跟PHP結合開發。
一、安裝
1. Windows平台
下載windows下的文件,其實就是一個命令列程序,(下載地址: sqlite>
# SQLite的提示符,如果想查看指令幫助輸入.help,在sqlite中所有系統指令都是. 開頭的:
sqlite> .help
.databases List names and files of attached databases
.dump ?TABLE? ... Dump the database in an SQL text format
.echo ON|OFF Turn command echo on or off
.exit Exit this program
.explain ON|OFF Turn output mode suitable for EXPLAIN on or off.
.header(s) ON|OFF Turn display of headers on or off
.help Show this message
.import FILE TABLE Import data from FILE into TABLE
.indices TABLE Show names of all indices on TABLE
.mode MODE ?TABLE? Set output mode where MODE is one of:
csv Comma-separated values
column Left-aligned columns. (See .width)
html HTML <table> code
insert SQL insert statements for TABLE
line One value per line
list Values delimited by .separator string
tabs Tab-separated values
tcl TCL list elements
.nullvalue STRING Print STRING in place of NULL values
.output FILENAME Send output to FILENAME
.output stdout Send output to the screen
.prompt MAIN CONTINUE Replace the standard prompts
.quit Exit this program
.read FILENAME Execute SQL in FILENAME
.schema ?TABLE? Show the CREATE statements
.separator STRING Change separator used by output mode and .import
.show Show the current values for various settings
.tables ?PATTERN? List names of tables matching a LIKE pattern
.timeout MS Try opening locked tables for MS milliseconds
.width NUM NUM ... Set column widths for "column" mode
sqlite>
www.knowsky.com
# 我們建立一個資料庫catlog
sqlite> create table catalog(
...> id integer primarykey,
...> pid integer,
...> name varchar(10) UNIQUE
...> );
sqlite>
# 如果表存在就會提示:
SQL error: table catalog already exists
# 我們建立索引訊息
create index catalog_idx on catalog (id asc);
# 我們查看表格的信息,看有多少表
sqlite> .table
aa catalog
# 查看表格的結構:
sqlite> .schema catalog
CREATE TABLE catalog(
id integer primary key,
pid integer,
name varchar(10) UNIQUE
);
CREATE INDEX catalog_idx on catalog(id asc);
# 將資料表插入一筆記錄
sqlite> insert into catalog (ppid,name) values ('001','heiyeluren');
# 成功無任何提示,如果表達式錯誤提示錯誤訊息:
SQL error: near "set": syntax error
# 檢索有多少筆記錄
sqlite> select count(*) from catalog;
1
# 檢索搜尋記錄
sqlite> select * from catalog;
1|1|heiyeluren
反正使用標準的SQL來操作就沒有問題,不清楚可以去官方網站上查看幫助資訊。另外還要說明的是SQLite不支援修改表結構,如果要修改表結構,只有刪除表重新再建立,所以建立表格的時候一定要考慮擴充性。估計以後這方面的功能會加強。
2. Linux/Unix 平台
error: 目前還沒裝過,呵呵,不過估計跟Windows差不多,改天把這部分內容補上。
二、PHP對SQLite的開發
PHP 5開始不再預設支援Mysql,而是預設支援SQLite,可見它的影響力多麼大,所以如果你想做SQLite的PHP開發,建議你使用PHP 5.0.0以上版本,我目前使用的是PHP 5.0.4版本,直接支援SQLite擴展,這裡我就不仔細講如何安裝PHP擴展,如果不清楚可以查看PHP相關文件。
這裡我主要是講針對SQLite的開發。目前PHP的主流DB類別都支援SQLite的驅動,包括PEAR::DB類別、ADOdb類別都支持,所以使用DB來做開發也是個好的選擇。
(以下操作為了簡便,都是再Windows xp平台進行的)
1. 使用PHP操作已經建立好的sqlite資料庫
如果你有一個已經透過sqlite.exe建立好了的資料庫和表格結構,那麼你就能夠直接對它進行操作。 php中針對sqlite的處理函數比較多,你可以查看PHP手冊以獲得詳細資訊。
我們使用sqlite_open()函數來開啟一個sqlite資料庫,它成功傳回一個作業資源,失敗回傳false,那麼以後的所有操作都是在這個資源上進行的,執行一個sql查詢使用sqlite_query函數。
下面我假設你在目前PHP程式目錄下有一個abc.db的sqlite資料庫文件,我們對該文件進行操作:
<?php
//開啟sqlite資料庫
$db = @sqlite_open("abc.db");
//例外處理
if (!$db) die("Connection Sqlite failed.n");
//新增一個叫做foo的資料庫
@sqlite_query($db, "CREATE TABLE foo (bar varchar(10))");
//插入一筆記錄
@sqlite_query($db, "INSERT INTO foo VALUES ('fnord')");
//檢索所有記錄
$result = @sqlite_query($db, 'select bar from foo');
//列印所取得的結果
print_r(sqlite_fetch_array($result));
?>
我們看到的輸出結果是:
Array
(
[0] => fnord
[巴] => fnord
)
證明我們程式碼執行成功,沒有輸入請檢查程序,或你的資料庫檔案是否存在。
那麼有了這個基本操作,你就能夠考慮使用更複雜的操作和SQL來操作它,讓它幫你管理信息,你可以做一個留言本,或者做一個CMS系統,我想都是沒有問題的。
2. 使用PHP建立資料庫並且操作
如果你沒有任何sqlite.exe之類的工具,那麼你也能夠透過php來建立一個sqlite資料庫,並且對它進行管理。
其實透過sqlite.exe程式建立的資料庫,內容是空的,其實只有後來等創建表,添加資料以後,資料庫文件才有,那麼我們是不是能夠手工添加一個文件,例如一個空的test.db 文件,並且對它進行操作。這是完全可以,下面我們就使用PHP程式來完成建立一個資料庫,並且執行簡單的建立資料表,插入資料和檢索資料的功能。
首先我們來看程式碼:(程式碼比較長,但比較容易理解)
<?php
/**
* 檔案:sqlite.php
* 功能:對sqlite資料庫的處理
* 作者:heiyeluren
* 時間:2005-8-5
*/
define("LN", __LINE__);//行號
define("FL", __FILE__);//目前文件
define("DEBUG", 0);//偵錯開關
$db_name = "heiyeluren.db";
//建立資料庫檔案,檔案內容為空
if (!file_exists($db_name)) {
if (!($fp = fopen($db_name, "w+"))) {
exit(error_code(-1, LN));
}
fclose($fp);
}
//開啟資料庫文件
if (!($db = sqlite_open($db_name))) {
exit(error_code(-2, LN));
}
//產生資料表結構
if (!sqlite_query($db, "DROP TABLE test")) {
exit(error_code(-3, LN));
}
if (!sqlite_query($db, "CREATE TABLE test (id integer primary key,pid integer,name varchar(10) UNIQUE)")) {
exit(error_code(-3, LN));
}
//插入一條數據
if (!sqlite_query($db, " INSERT INTO test (name) VALUES ('heiyeluren') ")) {
exit(error_code(-4, LN));
}
//把資料檢索出來
if (!($result = sqlite_query($db, "SELECT * FROM test"))) {
exit(error_code(-5, LN));
}
//取得檢索資料並顯示
while ($array = sqlite_fetch_array($result)) {
echo "ID: ". $array[id] ."<br>Name: ". $array[name] ;
}
/* 錯誤訊息代碼函數*/
function error_code($code, $line_num, $debug=DEBUG)
{
if ($code<-6 || $code>-1) {
return false;
}
switch($code) {
case -1: $errmsg = "Create database file error.";
break;
case -2: $errmsg = "Open sqlite database file failed.";
break;
case -3: $errmsg = "Create table failed, table already exist.";
break;
case -4: $errmsg = "Insert data failed.";
break;
case -5: $errmsg = "Query database data failed.";
break;
case -6: $errmsg = "Fetch data failed.";
break;
case -7: $errmsg = "";
break;
default: $errmsg = "Unknown error.";
}
$m = "<b>[ Error ]</b><br>File: ". basename(FL) ." <br>Line: ". LN ."<br>Mesg: ". $errmsg ."" ;
if (!$debug) {
($m = $errmsg);
}
return $m;
}
?>
如果你操作無誤的話,那麼程式最後輸出:
ID: 1
Name: heiyeluren
我們以上的程式包含了比較完整的功能,有調試、異常處理、存取資料庫等功能,算是簡單應用。如果你有興趣也可以擴展。
* 結束:
我們基本的操作就講到這裡,以後有空我會把內容補全。如果大家有興趣可以去研究一下,也許你的個人主頁就需要這樣的小型資料庫來幫助你。
* 參考文件:
http://www.donews.net/limodou/archive/2004/03/21/7997.aspx
http://www.linuxsir.org/bbs/showthread.php?p=1213668#post1213668
* SQLite資源 官方網站:http: //www.sqlite.org
SQL語法: http://www.sqlite.org/lang.html
開發文件: http://www.sqlite.org/docs.html
常見問題: http://www.sqlite.org/faq.html
下載網址: http://www.sqlite.org/download.html
Author: heiyeluren
Date: 2005-8-5