Sqlite數據庫sqlite3命令小記

SQLite庫包含一個名字叫作sqlite3的命令行,它可讓用戶手工輸入並執行面向SQLite數據庫的SQL命令。本文檔提供一個樣使用sqlite3的簡要說明。html

開始web

      啓動sqlite3程序,僅僅須要敲入帶有SQLite數據庫名字的"sqlite3"命令便可。若是文件不存在,則建立一個新的(數據庫)文件。而後sqlite3程序將提示你輸入SQL。敲入SQL語句(以分號「;」結束),敲回車鍵以後,SQL語句就會執行。sql

        例如,建立一個包含一個表"tb11"名字爲"ex1"的SQLite數據庫,你能夠這樣作:shell

$sqlite3 ex1數據庫

SQLite version 3.3.17框架

Enter ".help" for instructions函數

sqlite> create table tbl1(one varchar(10), two smallint);oop

sqlite> insert into tbl1 values('hello!', 10);ui

sqlite> insert into tbl1 values('goodbye', 20);this

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,那麼這個列寬將自動如下面三個數字中的最大值作爲列寬:十、表頭寬度和最寬的數據列的寬度。這可讓列自動調整寬度。每列的默認設置爲自動調整的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 1sqlite> .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>

 

事實上,你能夠查看sqlite3的源代碼(能夠在源文件樹的src/shell.c中),你可找到上面的具體的查詢。

「.indices」命令做用相似的方式是列出特定表的全部的索引。「.indics」命令須一個參數即所要索引表的表名。最後,但不是至少,是「.schema」命令。不帶任何參數,「.schema」命令顯示原始的用於建立當前數據庫的CREATE TABLE和CREATE INDEX語句。若是你給".schema"命令一個表名,它顯示原始的建立該表和它全部索引的CREATE語句。咱們能夠:

 

".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()中有用,由於命令行在傳遞它們到函數以前把這些翻譯爲分號。

從源文件中編譯sqlite3

sqlite3程序當你編譯SQLite庫時自動被創建。只須取得一個源文件樹的拷貝,運行「configure"而後"make"便可。

相關文章
相關標籤/搜索