SQLite命令行程序说明
sqlite3: 一個SQLite數據庫的命令行接口
??? 譯者注
??????? 原文地址:http://www.sqlite.org/sqlite.html
??? SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執行面向SQLite數據庫的SQL命令。本文檔提供一個樣使用sqlite3的簡要說明。
開始
????? 啟動sqlite3程序,僅僅需要敲入帶有SQLite數據庫名字的"sqlite3"命令即可。如果文件不存在,則創建一個新的(數據庫)文件。然后sqlite3程序將提示你輸入SQL。敲入SQL語句(以分號“;”結束),敲回車鍵之后,SQL語句就會執行。
??????? 例如,創建一個包含一個表"tb11"名字為"ex1"的SQLite數據庫,你可以這樣做:
$sqlite3 ex1
SQLite version 3.3.17
Enter ".help" for instructions
sqlite>?create table tbl1(one varchar(10), two smallint);
sqlite>?insert into tbl1 values('hello!', 10);
sqlite>?insert into tbl1 values('goodbye', 20);
sqlite>?select * from tbl1;
hello!|10
goodbye|20
sqlite>
??????? 你可以通過敲你所用系統的文件結束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C)。來終止sqlite3程序。確定你在每個SQL語句結束敲入分號!sqlite3程序通過查找分號來決定一個SQL語句的結束。如果你省略分 號,sqlite3將給你一個連續的命令提示符并等你給當前的SQL命令添加更多的文字。這個特點讓你輸入多行的多個SQL語句,例如:
sqlite>?create table tbl2(
?? ...>?f1 varchar(30) primary key,
?? ...>?f2 text,
?? ...>?f3 real
?? ...>?);
sqlite>
題外話:查詢SQLITE_MASTER表
??? SQLite數據庫的框架被保存在一個名叫"sqlite_master"的特殊的表中。你可以像查詢其它表一樣通過執行“SELECT”查詢這個特殊的表。例如:
$?sqlite3?ex1
SQlite?vresion?3.3.10
Enter?".help"?for?instructions
sqlite>?select?*?from?sqlite_master;
????type?=?table
????name?=?tbl1
tbl_name?=?tbl1
rootpage?=?3
?????sql?=?create?table?tbl1(one?varchar(10),?two?smallint)
sqlite>
??? 但你不能在sqlite_master表中執行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創建、刪除和索引數據庫時自動更新這個表。你不能手工更改sqlite_master表。
??? TEMPORARY表的結構沒有存儲在"sqlite_master"表中,由于TEMPORARY表對應用是不可見的,而不是應用程序創建這個表。 TEMPORARY表結構被存儲在另外一個名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨 時表自身。
sqlite3的特殊命令
?? 大多數候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫中去運行。但是如果輸入行以一個點(“.”)開始,那么這行將被sqlite3程序自 己截取并解釋。這些“點命令”通常被用來改變查詢輸出的格式,或者執行鞭個預封包(預定義prepackaged)的查詢語句。
你可以在任何時候輸入“.help”,列出可用的點命令。例如
sqlite>?.help
.bail?ON|OFF???????????Stop?after?hitting?an?error.??Default?OFF
.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
.load?FILE??ENTRY??????Load?an?extension?library
.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>
改變輸出格式
??? sqlite3程序可以以八種不同的格式顯示一個查詢的結果:"csv", "列", "html", "插入", "行", "制表"和"tcl"。你可以用".mode"點命令在這些輸出格式之間切換。
??? 默認的輸出格式是“列表”。在列表模式下,每條查詢結果記錄被寫在一行中并且每列之間以一個字符串分割符隔開。默認的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結果到另外一個符加處理的程序(如AWK)中去是尤為有用。
sqlite>?.mode?list
sqlite>?select?*?from?tbl1;
hello|10
goodbye|20
sqlite>
??? 你可以用“.separator”點命令來改變分界符。例如,為了把分割符改為一個逗號和一個空格,你可以這樣做:
sqlite>?.separator?",?"
sqlite>?select?*?from?tbl1;
hello,?10
goodbye,?20
sqlite>
??? 在“line"模式下,每一個位于條記錄中的列在它自己那行顯示。每行由列名、一個等號和列數據組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:
sqlite>?.mode?line
sqlite>?select?*?from?tbl1;
one?=?hello
two?=?10
one?=?goodbye
two?=?20
sqlite>
??? 在列模式下,每條記錄在一個單獨的行中以數據列對齊的方式顯示。列如:
sqlite>?.mode?column
sqlite>?select?*?from?tbl1;
one?????????two???????
----------??----------
hello???????10????????
goodbye?????20????????
sqlite>
??????? 在默認的情況下,每列至少10個字符寬。太寬的數據將被截取。你可以用“.width”命令來調整列寬。如下所示:
sqlite>?.width?12?6
sqlite>?select?*?from?tbl1;
one???????????two???
------------??------
hello?????????10????
goodbye???????20????
sqlite>
????上面例子中".width"命令設置第一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢結果需要的列數一樣多的“.width”參數。
??? 如果你指定一列寬為0,那么這個列寬將自動以下面三個數字中的最大值做為列寬:10、表頭寬度和最寬的數據列的寬度。這可以讓列自動調整寬度。每列的默認設置為自動調整的0值。
??? 出現在輸出開頭兩行的列標示可以用".header"點命令關閉。在上面的例子中,列標示是打開的。可以用下面的方法關閉列標示:
sqlite>?.header?off
sqlite>?select?*?from?tbl1;
hello?????????10????
goodbye???????20????
sqlite>
??? 另外一個有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來像SQL INSERT語句的樣式。你可以用插入模式來產生文件(便于)以后用于不同數據庫的輸入。
??? 當指定插入模式時,你必須給定一個特定參數就是要插入的表名。例如:
sqlite>?.mode?insert?new_table
sqlite>?select?*?from?tbl1;
INSERT?INTO?'new_table'?VALUES('hello',10);
INSERT?INTO?'new_table'?VALUES('goodbye',20);
sqlite>
??? 最新的輸出格式是“html”。在這種模式下,sqlite3把查詢的結果寫做XHTML表。開始的<TABLE>和結束 的</TABLE>(標記)沒有寫出,但有<TR>、<TH>和<TD>等分界符。html輸出對 CGI來說是相當有用地。
把結果寫到文件中
??? 默認情況下,sqlte3把結送到標準輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數然后所有后續查詢結果將被寫到那個文件中。用“.output stdout”再一次改為標準輸出。例如:
sqlite>?.mode?list
sqlite>?.separator?|
sqlite>?.output?test_file_1.txt
sqlite>?select?*?from?tbl1;
sqlite>?.exit
$?cat?test_file_1.txt
hello|10
goodbye|20
$
查詢數據庫結構
????sqlite3程序提供幾個有用的用于查詢數據庫結構的快捷命令。這些不是不可以用別的方式來實現。這些命令僅僅是一個快捷方式而已。
??? 例如,為了查看數據庫的表列表,你可以敲入“.tables”。
sqlite>?.tables
tbl1
tbl2
sqlite>
??? “.tables”命令相似于設置列表模式然后執行接下來的查詢:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1事實上,你可以查看sqlite3的源代碼(可以在源文件樹的src/shell.c中),你可找到上面的具體的查詢。“.indices” 命令作用類似的方式是列出特定表的所有的索引。“.indics”命令須一個參數即所要索引表的表名。最后,但不是至少,是“.schema”命令。不帶 任何參數,“.schema”命令顯示原始的用于創建當前數據庫的CREATE TABLE和CREATE INDEX語句。如果你給".schema"命令一個表名,它顯示原始的創建該表和它所有索引的CREATE語句。我們可以:sqlite>?.schema
create?table?tbl1(one?varchar(10),?two?smallint)
CREATE?TABLE?tbl2?(
??f1?varchar(30)?primary?key,
??f2?text,
??f3?real
)
sqlite>?.schema?tbl2
CREATE?TABLE?tbl2?(
??f1?varchar(30)?primary?key,
??f2?text,
??f3?real
)
sqlite>".schema"命令可以用設置列表然后執行以下查詢來實現:SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type!='meta' ORDER BY tbl_name, type DESC, name或者,如果你給".schema"命令一個參數,由于你只想得到一個表的結構,查詢可以是這樣:SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' ORDER BY substr(type,2,1), name 你可以擔供一個參數給.schema命令。如果這橛,查詢可以是這樣的:SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE tbl_name LIKE '%s' AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%' ORDER BY substr(type,2,1), name 在查詢中“%S“為你的參數所取代。這使你可以詢數據庫結構的某個子集。sqlite>?.schema?%abc%與這些一起,“.table”命令也接受一個模式作為他的參數。如果你給“.table”一個參數,“%”將被前后擴展并且一個LIKE子句被附加到查詢上。這讓你可以列出只與特定模式相匹配的的表。“.datebasae” 命令顯示所有當前連接打開的數據庫的一個列表。將允許一次到少兩個。第一個是“main”,最初打開的那個數據庫。第二個是"temp",用于臨時表的數 據庫。對于用ATTACH語句附加的數據也許有附加數據庫列表。輸出的第一列與之相聯的數據庫名,第二列是外部文件名。sqlite>?.databases將整個數據庫轉換為ASCII文本文件".dump"命令成一個單一的ASCII文本文件。這個文件可以被用作管道傳遞給sqlite3命令來轉換回數據庫。一個最好的制作一個數據庫檔案拷貝的命令是:$?echo?'.dump'?|?sqlite3?ex1?|?gzip?-c?>ex1.dump.gz它產生一個一個名為ex1.dump.gz的文件,它包含了你以后或在其它機器上重構數據庫的所有的信息。要重構數據庫,只須敲入:$?zcat?ex1.dump.gz?|?sqlite3?ex2這個文本格式是純粹的SQL語句所以你可以用.dump命令來導出一個SQLite數據庫到另一個常用的SQL數據庫引擎。比如:$?createdb?ex2
$?sqlite3?ex1?.dump?|?psql?ex2其它的點命令".explain" 命令可以被用來設置輸出格式為“column”?并設置列寬為EXPLAIN命令看起來比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴 展,它是對調試有用。如果任何常規的SQL被EXPLAIN執行,那么SQL命令被分解并分析但并不執行。取而代之的是,虛擬機指令序列將被用于執行 SQL命令并返回一個類似的查詢結果。如:
sqlite>?.explain
sqlite>?explain?delete?from?tbl1?where?two<20;
addr??opcode????????p1?????p2?????p3??????????
----??------------??-----??-----??-------------------------------------???
0?????ListOpen??????0??????0??????????????????
1?????Open??????????0??????1??????tbl1????????
2?????Next??????????0??????9??????????????????
3?????Field?????????0??????1??????????????????
4?????Integer???????20?????0??????????????????
5?????Ge????????????0??????2??????????????????
6?????Key???????????0??????0??????????????????
7?????ListWrite?????0??????0??????????????????
8?????Goto??????????0??????2??????????????????
9?????Noop??????????0??????0??????????????????
10????ListRewind????0??????0??????????????????
11????ListRead??????0??????14?????????????????
12????Delete????????0??????0??????????????????
13????Goto??????????0??????11?????????????????
14????ListClose?????0??????0
“.timeout”命令設置sqlite3等待一個試圖存儲文件鎖定請除直到錯誤返回的總時間。默認的超時值是0因此如果任何需要的數據庫表或序列列被鎖定時它將立即返回一個錯誤。最后,我們提到“.exit”命令它交導致sqlite3退出。在命令和腳本中使用sqlite3一 個在腳本命令中使用sqlite3的方式是用“echo”或“cat”來產生一個命令序列在一個文件中,然后當從一個產生的命令行中重定向輸入時調用 sqlite3。它有用并且適應許多環境。但作為一附加的便利是,sqlite3允許一個單一的SQL語句在命令行中作為數據庫名后的第二個參數輸入。當 sqlite3程序帶著兩個參數啟動時,第二個參數被傳遞給SQLite庫處理,查詢以列表模式打印到標準輸出,然后程序退出。這個機制被設計用于讓 sqlite3容易于用于連接諸如"AWK"的程序。例如:$?sqlite3?ex1?'select?*?from?tbl1'?|
>??awk?'{printf?"<tr><td>%s<td>%s\n",$1,$2?}'
<tr><td>hello<td>10
<tr><td>goodbye<td>20
$結束命令行命令SQLite 命令通常以一個分號結束。在一個命令行中你也可以用“GO”單詞(大小寫敏感)或者一個“/”斜線在它所在好行結束一個命令。這常被SQL Server和Oracle使用。這些將不在sqlite3_exec()中有用,因為命令行在傳遞它們到函數之前把這些翻譯為分號。從源文件中編譯sqlite3sqlite3程序當你編譯SQLite庫時自動被建立。只須取得一個源文件樹的拷貝,運行“configure"然后"make"即可。
總結
以上是生活随笔為你收集整理的SQLite命令行程序说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dpkg and apt
- 下一篇: Android重要组件之一 Servic