SQLite命令行程序说明
sqlite3: 一個(gè)SQLite數(shù)據(jù)庫(kù)的命令行接口
??? 譯者注
??????? 原文地址:http://www.sqlite.org/sqlite.html
??? SQLite庫(kù)包含一個(gè)名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執(zhí)行面向SQLite數(shù)據(jù)庫(kù)的SQL命令。本文檔提供一個(gè)樣使用sqlite3的簡(jiǎn)要說(shuō)明。
開始
????? 啟動(dòng)sqlite3程序,僅僅需要敲入帶有SQLite數(shù)據(jù)庫(kù)名字的"sqlite3"命令即可。如果文件不存在,則創(chuàng)建一個(gè)新的(數(shù)據(jù)庫(kù))文件。然后sqlite3程序?qū)⑻崾灸爿斎隨QL。敲入SQL語(yǔ)句(以分號(hào)“;”結(jié)束),敲回車鍵之后,SQL語(yǔ)句就會(huì)執(zhí)行。
??????? 例如,創(chuàng)建一個(gè)包含一個(gè)表"tb11"名字為"ex1"的SQLite數(shù)據(jù)庫(kù),你可以這樣做:
$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>
??????? 你可以通過(guò)敲你所用系統(tǒng)的文件結(jié)束符(通常是Ctrl + D)或者中斷字符(通常是Ctrl + C)。來(lái)終止sqlite3程序。確定你在每個(gè)SQL語(yǔ)句結(jié)束敲入分號(hào)!sqlite3程序通過(guò)查找分號(hào)來(lái)決定一個(gè)SQL語(yǔ)句的結(jié)束。如果你省略分 號(hào),sqlite3將給你一個(gè)連續(xù)的命令提示符并等你給當(dāng)前的SQL命令添加更多的文字。這個(gè)特點(diǎn)讓你輸入多行的多個(gè)SQL語(yǔ)句,例如:
sqlite>?create table tbl2(
?? ...>?f1 varchar(30) primary key,
?? ...>?f2 text,
?? ...>?f3 real
?? ...>?);
sqlite>
題外話:查詢SQLITE_MASTER表
??? SQLite數(shù)據(jù)庫(kù)的框架被保存在一個(gè)名叫"sqlite_master"的特殊的表中。你可以像查詢其它表一樣通過(guò)執(zhí)行“SELECT”查詢這個(gè)特殊的表。例如:
$?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表中執(zhí)行諸如DROP TABLE, UPDATE, INSERT 或者DELETE命令。sqlite_master表在你創(chuàng)建、刪除和索引數(shù)據(jù)庫(kù)時(shí)自動(dòng)更新這個(gè)表。你不能手工更改sqlite_master表。
??? TEMPORARY表的結(jié)構(gòu)沒有存儲(chǔ)在"sqlite_master"表中,由于TEMPORARY表對(duì)應(yīng)用是不可見的,而不是應(yīng)用程序創(chuàng)建這個(gè)表。 TEMPORARY表結(jié)構(gòu)被存儲(chǔ)在另外一個(gè)名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨 時(shí)表自身。
sqlite3的特殊命令
?? 大多數(shù)候,sqlite3讀入輸入行,并把它們傳遞到SQLite庫(kù)中去運(yùn)行。但是如果輸入行以一個(gè)點(diǎn)(“.”)開始,那么這行將被sqlite3程序自 己截取并解釋。這些“點(diǎn)命令”通常被用來(lái)改變查詢輸出的格式,或者執(zhí)行鞭個(gè)預(yù)封包(預(yù)定義prepackaged)的查詢語(yǔ)句。
你可以在任何時(shí)候輸入“.help”,列出可用的點(diǎn)命令。例如
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程序可以以八種不同的格式顯示一個(gè)查詢的結(jié)果:"csv", "列", "html", "插入", "行", "制表"和"tcl"。你可以用".mode"點(diǎn)命令在這些輸出格式之間切換。
??? 默認(rèn)的輸出格式是“列表”。在列表模式下,每條查詢結(jié)果記錄被寫在一行中并且每列之間以一個(gè)字符串分割符隔開。默認(rèn)的分隔符是一個(gè)管道符號(hào)(“|”)。列表符號(hào)在當(dāng)你輸出查詢結(jié)果到另外一個(gè)符加處理的程序(如AWK)中去是尤為有用。
sqlite>?.mode?list
sqlite>?select?*?from?tbl1;
hello|10
goodbye|20
sqlite>
??? 你可以用“.separator”點(diǎn)命令來(lái)改變分界符。例如,為了把分割符改為一個(gè)逗號(hào)和一個(gè)空格,你可以這樣做:
sqlite>?.separator?",?"
sqlite>?select?*?from?tbl1;
hello,?10
goodbye,?20
sqlite>
??? 在“l(fā)ine"模式下,每一個(gè)位于條記錄中的列在它自己那行顯示。每行由列名、一個(gè)等號(hào)和列數(shù)據(jù)組成。下一條記錄以一個(gè)空行隔開。這是一個(gè)行模式輸出的例子:
sqlite>?.mode?line
sqlite>?select?*?from?tbl1;
one?=?hello
two?=?10
one?=?goodbye
two?=?20
sqlite>
??? 在列模式下,每條記錄在一個(gè)單獨(dú)的行中以數(shù)據(jù)列對(duì)齊的方式顯示。列如:
sqlite>?.mode?column
sqlite>?select?*?from?tbl1;
one?????????two???????
----------??----------
hello???????10????????
goodbye?????20????????
sqlite>
??????? 在默認(rèn)的情況下,每列至少10個(gè)字符寬。太寬的數(shù)據(jù)將被截取。你可以用“.width”命令來(lái)調(diào)整列寬。如下所示:
sqlite>?.width?12?6
sqlite>?select?*?from?tbl1;
one???????????two???
------------??------
hello?????????10????
goodbye???????20????
sqlite>
????上面例子中".width"命令設(shè)置第一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢結(jié)果需要的列數(shù)一樣多的“.width”參數(shù)。
??? 如果你指定一列寬為0,那么這個(gè)列寬將自動(dòng)以下面三個(gè)數(shù)字中的最大值做為列寬:10、表頭寬度和最寬的數(shù)據(jù)列的寬度。這可以讓列自動(dòng)調(diào)整寬度。每列的默認(rèn)設(shè)置為自動(dòng)調(diào)整的0值。
??? 出現(xiàn)在輸出開頭兩行的列標(biāo)示可以用".header"點(diǎn)命令關(guān)閉。在上面的例子中,列標(biāo)示是打開的??梢杂孟旅娴姆椒P(guān)閉列標(biāo)示:
sqlite>?.header?off
sqlite>?select?*?from?tbl1;
hello?????????10????
goodbye???????20????
sqlite>
??? 另外一個(gè)有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來(lái)像SQL INSERT語(yǔ)句的樣式。你可以用插入模式來(lái)產(chǎn)生文件(便于)以后用于不同數(shù)據(jù)庫(kù)的輸入。
??? 當(dāng)指定插入模式時(shí),你必須給定一個(gè)特定參數(shù)就是要插入的表名。例如:
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把查詢的結(jié)果寫做XHTML表。開始的<TABLE>和結(jié)束 的</TABLE>(標(biāo)記)沒有寫出,但有<TR>、<TH>和<TD>等分界符。html輸出對(duì) CGI來(lái)說(shuō)是相當(dāng)有用地。
把結(jié)果寫到文件中
??? 默認(rèn)情況下,sqlte3把結(jié)送到標(biāo)準(zhǔn)輸出。你可以用“.output”命令改變它。只須把輸出文件名做為.output命令的輸出參數(shù)然后所有后續(xù)查詢結(jié)果將被寫到那個(gè)文件中。用“.output stdout”再一次改為標(biāo)準(zhǔn)輸出。例如:
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
$
查詢數(shù)據(jù)庫(kù)結(jié)構(gòu)
????sqlite3程序提供幾個(gè)有用的用于查詢數(shù)據(jù)庫(kù)結(jié)構(gòu)的快捷命令。這些不是不可以用別的方式來(lái)實(shí)現(xiàn)。這些命令僅僅是一個(gè)快捷方式而已。
??? 例如,為了查看數(shù)據(jù)庫(kù)的表列表,你可以敲入“.tables”。
sqlite>?.tables
tbl1
tbl2
sqlite>
??? “.tables”命令相似于設(shè)置列表模式然后執(zhí)行接下來(lái)的查詢:
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事實(shí)上,你可以查看sqlite3的源代碼(可以在源文件樹的src/shell.c中),你可找到上面的具體的查詢。“.indices” 命令作用類似的方式是列出特定表的所有的索引。“.indics”命令須一個(gè)參數(shù)即所要索引表的表名。最后,但不是至少,是“.schema”命令。不帶 任何參數(shù),“.schema”命令顯示原始的用于創(chuàng)建當(dāng)前數(shù)據(jù)庫(kù)的CREATE TABLE和CREATE INDEX語(yǔ)句。如果你給".schema"命令一個(gè)表名,它顯示原始的創(chuàng)建該表和它所有索引的CREATE語(yǔ)句。我們可以: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"命令可以用設(shè)置列表然后執(zhí)行以下查詢來(lái)實(shí)現(xiàn):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"命令一個(gè)參數(shù),由于你只想得到一個(gè)表的結(jié)構(gòu),查詢可以是這樣: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 你可以擔(dān)供一個(gè)參數(shù)給.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“為你的參數(shù)所取代。這使你可以詢數(shù)據(jù)庫(kù)結(jié)構(gòu)的某個(gè)子集。sqlite>?.schema?%abc%與這些一起,“.table”命令也接受一個(gè)模式作為他的參數(shù)。如果你給“.table”一個(gè)參數(shù),“%”將被前后擴(kuò)展并且一個(gè)LIKE子句被附加到查詢上。這讓你可以列出只與特定模式相匹配的的表。“.datebasae” 命令顯示所有當(dāng)前連接打開的數(shù)據(jù)庫(kù)的一個(gè)列表。將允許一次到少兩個(gè)。第一個(gè)是“main”,最初打開的那個(gè)數(shù)據(jù)庫(kù)。第二個(gè)是"temp",用于臨時(shí)表的數(shù) 據(jù)庫(kù)。對(duì)于用ATTACH語(yǔ)句附加的數(shù)據(jù)也許有附加數(shù)據(jù)庫(kù)列表。輸出的第一列與之相聯(lián)的數(shù)據(jù)庫(kù)名,第二列是外部文件名。sqlite>?.databases將整個(gè)數(shù)據(jù)庫(kù)轉(zhuǎn)換為ASCII文本文件".dump"命令成一個(gè)單一的ASCII文本文件。這個(gè)文件可以被用作管道傳遞給sqlite3命令來(lái)轉(zhuǎn)換回?cái)?shù)據(jù)庫(kù)。一個(gè)最好的制作一個(gè)數(shù)據(jù)庫(kù)檔案拷貝的命令是:$?echo?'.dump'?|?sqlite3?ex1?|?gzip?-c?>ex1.dump.gz它產(chǎn)生一個(gè)一個(gè)名為ex1.dump.gz的文件,它包含了你以后或在其它機(jī)器上重構(gòu)數(shù)據(jù)庫(kù)的所有的信息。要重構(gòu)數(shù)據(jù)庫(kù),只須敲入:$?zcat?ex1.dump.gz?|?sqlite3?ex2這個(gè)文本格式是純粹的SQL語(yǔ)句所以你可以用.dump命令來(lái)導(dǎo)出一個(gè)SQLite數(shù)據(jù)庫(kù)到另一個(gè)常用的SQL數(shù)據(jù)庫(kù)引擎。比如:$?createdb?ex2
$?sqlite3?ex1?.dump?|?psql?ex2其它的點(diǎn)命令".explain" 命令可以被用來(lái)設(shè)置輸出格式為“column”?并設(shè)置列寬為EXPLAIN命令看起來(lái)比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴(kuò) 展,它是對(duì)調(diào)試有用。如果任何常規(guī)的SQL被EXPLAIN執(zhí)行,那么SQL命令被分解并分析但并不執(zhí)行。取而代之的是,虛擬機(jī)指令序列將被用于執(zhí)行 SQL命令并返回一個(gè)類似的查詢結(jié)果。如:
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”命令設(shè)置sqlite3等待一個(gè)試圖存儲(chǔ)文件鎖定請(qǐng)除直到錯(cuò)誤返回的總時(shí)間。默認(rèn)的超時(shí)值是0因此如果任何需要的數(shù)據(jù)庫(kù)表或序列列被鎖定時(shí)它將立即返回一個(gè)錯(cuò)誤。最后,我們提到“.exit”命令它交導(dǎo)致sqlite3退出。在命令和腳本中使用sqlite3一 個(gè)在腳本命令中使用sqlite3的方式是用“echo”或“cat”來(lái)產(chǎn)生一個(gè)命令序列在一個(gè)文件中,然后當(dāng)從一個(gè)產(chǎn)生的命令行中重定向輸入時(shí)調(diào)用 sqlite3。它有用并且適應(yīng)許多環(huán)境。但作為一附加的便利是,sqlite3允許一個(gè)單一的SQL語(yǔ)句在命令行中作為數(shù)據(jù)庫(kù)名后的第二個(gè)參數(shù)輸入。當(dāng) sqlite3程序帶著兩個(gè)參數(shù)啟動(dòng)時(shí),第二個(gè)參數(shù)被傳遞給SQLite庫(kù)處理,查詢以列表模式打印到標(biāo)準(zhǔn)輸出,然后程序退出。這個(gè)機(jī)制被設(shè)計(jì)用于讓 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
$結(jié)束命令行命令SQLite 命令通常以一個(gè)分號(hào)結(jié)束。在一個(gè)命令行中你也可以用“GO”單詞(大小寫敏感)或者一個(gè)“/”斜線在它所在好行結(jié)束一個(gè)命令。這常被SQL Server和Oracle使用。這些將不在sqlite3_exec()中有用,因?yàn)槊钚性趥鬟f它們到函數(shù)之前把這些翻譯為分號(hào)。從源文件中編譯sqlite3sqlite3程序當(dāng)你編譯SQLite庫(kù)時(shí)自動(dòng)被建立。只須取得一個(gè)源文件樹的拷貝,運(yùn)行“configure"然后"make"即可。
總結(jié)
以上是生活随笔為你收集整理的SQLite命令行程序说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dpkg and apt
- 下一篇: Android重要组件之一 Servic