《linux下sqlite3的特殊命令(2)》要點(diǎn):
本文介紹了linux下sqlite3的特殊命令(2),希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:sqlite3
當(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輸出對 CGI來說是相當(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ù)庫結(jié)構(gòu)
sqlite3程序提供幾個(gè)有用的用于查詢數(shù)據(jù)庫結(jié)構(gòu)的快捷命令。這些不是不可以用別的方式來實(shí)現(xiàn)。這些命令僅僅是一個(gè)快捷方式而已。
例如,為了查看數(shù)據(jù)庫的表列表,你可以敲入“.tables”。
sqlite> .tables
tbl1
tbl2
sqlite>
“.tables”命令相似于設(shè)置列表模式然后執(zhí)行接下來的查詢:
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ù)庫的 CREATE TABLE和CREATE INDEX語句。如果你給".schema"命令一個(gè)表名,它顯示原始的創(chuàng)建該表和它所有索引的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"命令可以用設(shè)置列表然后執(zhí)行以下查詢來實(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ù)庫結(jié)構(gòu)的某個(gè)子集。
sqlite> .schema %abc%
與這些一起,“.table”命令也接受一個(gè)模式作為他的參數(shù)。如果你給“.table”一個(gè)參數(shù),“%”將被前后擴(kuò)展并且一個(gè)LIKE子句被附加到查詢上。這讓你可以列出只與特定模式相匹配的的表。
“.datebasae”命令顯示所有當(dāng)前連接打開的數(shù)據(jù)庫的一個(gè)列表。將允許一次到少兩個(gè)。第一個(gè)是“main”,最初打開的那個(gè)數(shù)據(jù)庫。第二個(gè)是"temp",用于臨時(shí)表的數(shù)據(jù)庫。對于用ATTACH語句附加的數(shù)據(jù)也許有附加數(shù)據(jù)庫列表。輸出的第一列與之相聯(lián)的數(shù)據(jù)庫名,第二列是外部文件名。
sqlite> .databases
將整個(gè)數(shù)據(jù)庫轉(zhuǎn)換為ASCII文本文件
".dump"命令成一個(gè)單一的ASCII文本文件。這個(gè)文件可以被用作管道傳遞給sqlite3命令來轉(zhuǎn)換回?cái)?shù)據(jù)庫。
一個(gè)最好的制作一個(gè)數(shù)據(jù)庫檔案拷貝的命令是:
$ echo '.dump' | sqlite3 ex1 | gzip -c >ex1.dump.gz
它產(chǎn)生一個(gè)一個(gè)名為ex1.dump.gz的文件,它包含了你以后或在其它機(jī)器上重構(gòu)數(shù)據(jù)庫的所有的信息。要重構(gòu)數(shù)據(jù)庫,只須敲入:
$ zcat ex1.dump.gz | sqlite3 ex2
這個(gè)文本格式是純粹的SQL語句所以你可以用.dump命令來導(dǎo)出一個(gè)SQLite數(shù)據(jù)庫到另一個(gè)常用的SQL數(shù)據(jù)庫引擎。比如:
$ createdb ex2
$ sqlite3 ex1 .dump | psql ex2
其它的點(diǎn)命令
".explain"命令可以被用來設(shè)置輸出格式為“column” 并設(shè)置列寬為 EXPLAIN命令看起來比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴(kuò)展,它是對調(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ǔ)文件鎖定請除直到錯(cuò)誤返回的總時(shí)間。默認(rèn)的超時(shí)值是0因此如果任何需要的數(shù)據(jù)庫表或序列列被鎖定時(shí)它將立即返回一個(gè)錯(cuò)誤。
最后,我們提到“.exit”命令它交導(dǎo)致sqlite3退出。
在命令和腳本中使用sqlite3
一個(gè)在腳本命令中使用sqlite3的方式是用“echo”或“cat”來產(chǎn)生一個(gè)命令序列在一個(gè)文件中,然后當(dāng)從一個(gè)產(chǎn)生的命令行中重定向輸入時(shí)調(diào)用sqlite3。它有用并且適應(yīng)許多環(huán)境。但作為一附加的便利是,sqlite3允許一個(gè)單一的SQL語句在命令行中作為數(shù)據(jù)庫名后的第二個(gè)參數(shù)輸入。當(dāng)sqlite3程序帶著兩個(gè)參數(shù)啟動(dòng)時(shí),第二個(gè)參數(shù)被傳遞給SQLite庫處理,查詢以列表模式打印到標(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è)分號結(jié)束。在一個(gè)命令行中你也可以用“GO”單詞(大小寫敏感)或者一個(gè)“/”斜線在它所在好行結(jié)束一個(gè)命令。這常被SQL Server和Oracle使用。這些將不在sqlite3_exec()中有用,因?yàn)槊钚性趥鬟f它們到函數(shù)之前把這些翻譯為分號。
從源文件中編譯sqlite3
sqlite3程序當(dāng)你編譯SQLite庫時(shí)自動(dòng)被建立。只須取得一個(gè)源文件樹的拷貝,運(yùn)行“configure"然后"make"即可。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/86_2.html