1. 程式人生 > >sqlite 常用設定命令

sqlite 常用設定命令

sqlite有些常用命令,對應用sqlite資料有很大用途。

下面詳細講解一下:

 

SQLITE_MASTER 表

一個SQLite資料庫的資料結構是存貯在 "sqlite_master" 表中。你可以像其他資料表一樣對 sqlite_master 表執行 “SELECT” 語句,例如:

sqlite3 ex1
SQlite vresion 3.3.10
Enter ".help" for instructions
sqlite> select * from sqlite_master;
     type = table
  tbl_name = tbl1  

   name = tbl1
  rootpage = 3
      sql = create table tbl1(one varchar(10), two smallint)
sqlite>

 

將結果寫到檔案

預設情況下,sqlite3會將結果傳送到標準輸出,你可以使用 ".output" 來改變,只是將輸出到的檔名作為引數傳遞給 .output,所有後面的查詢結果都會寫到檔案裡。開頭使用 ".output stdout" 會再次寫到標準輸出,例如:

sqlite> .mode list    顯示模式
sqlite> .separator |   欄位直接間隔
sqlite> .output test_file_1.txt  輸出到那個檔案
sqlite> select * from tb1;   查詢資料
sqlite> .exit         退出
# cat test_file_1.txt


hello|10
goodbye|20

 

改變輸出格式

sqlite3程式可以以八種不同的格式顯示一個查詢的結果:"csv", "列", "html", "插入", "行", "製表"和"tcl"。你可以用".mode"點命令在這些輸出格式之間切換。

    預設的輸出格式是“列表”。在列表模式下,每條查詢結果記錄被寫在一行中並且每列之間以一個字串分割符隔開。預設的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結果到另外一個符加處理的程式(如AWK)中去是尤為有用。

sqlite> .mode list
sqlite> select * from tb1;
hello|10
goodbye|20
sqlite>

    你可以用“.separator”點命令來改變分界符。例如,為了把分割符改為一個逗號和一個空格,你可以這樣做:

sqlite> .separator ", "
sqlite> select * from tb1;
hello, 10
goodbye, 20
sqlite>

    在“line"模式下,每一個位於條記錄中的列在它自己那行顯示。每行由列名、一個等號和列資料組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:

sqlite> .mode line
sqlite> select * from tb1;
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 tb1;
hello         10    
goodbye       20    
sqlite>

.header on可以開啟列標示;

    另外一個有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來像SQL INSERT語句的樣式。你可以用插入模式來產生檔案(便於)以後用於不同資料庫的輸入。

    當指定插入模式時,你必須給定一個特定引數就是要插入的表名。例如:

sqlite> .mode insert new_table
sqlite> select * from tb1;
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來說是相當有用地。

 sqlite> .mode html
sqlite> select * from tb1;
<TR><TD>hello!</TD>
<TD>10</TD>
</TR>
<TR><TD>hello!</TD>
<TD>10</TD>
</TR>
<TR><TD>hello!</TD>
<TD>10</TD>
</TR>
<TR><TD>hello!</TD>
<TD>10</TD>
</TR>
<TR><TD>goodbye</TD>
<TD>20</TD>
</TR>

 

查詢資料庫結構

 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 
sqlite> .databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             //ex1
1    temp             /tmp/etilqs_SAmtUWMcNv0tqMn
 
將整個資料庫轉換為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 ex2sqlite3 ex1 .dump | psql ex2  
 
 
  
其它的點命令 
".explain"命令可以被用來設定輸出格式為“column” 並設定列寬為EXPLAIN命令看起來比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴充套件,它是對除錯有用。如果任何常規的SQL被EXPLAIN執行,那麼SQL命令被分解並分析但並不執行。取而代之的是,虛擬機器指令序列將被用於執行SQL命令並返回一個類似的查詢結果。如: 
 
  
 “.timeout”命令設定sqlite3等待一個試圖儲存檔案鎖定請除直到錯誤返回的總時間。預設的超時值是0因此如果任何需要的資料庫表或序列列被鎖定時它將立即返回一個錯誤。 

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