轉http://www.helplib.net/s/sqlite/9/15.shtml
SQLite 庫包含了一個簡單的命令行實用工具命名sqlite3 (或sqlite3exe 在windows 上), 它允許用戶手動輸入並執行SQL 命令針對一個SQLite 數據庫此文檔提供了有關如何使用簡要介紹sqlite3 程序
使用入門
要啟動"sqlite3 程序時, 只需鍵入"sqlite3 ", 后跟該文件SQLite , 該數據庫如果該文件不存在, 則自動"sqlite3 程序將提示您要輸入SQL在SQL 語句類型(由一個semicolon) 終止, SQL 按"enter ", 將會被執行
例如, 要創建一個新的名為"ex1 "SQLite 數據庫使用一個"tbl1 名為的表", 可能會這樣做:
$sqlite3 ex1 SQLite 版本3611 輸入"幫助"有關說明 用"; "輸入SQL 語句終止 sqlite > create table tbl1(one varchar(10) , 兩個smallint) ; sqlite > insert into tbl1 values( ''hello! '', 10) ; sqlite > insert into tbl1 values( ''goodbye '' , 20) ; sqlite > select *from tbl1 ; hello!|10 goodbye|20 sqlite >
通過鍵入以下命令可以終止sqlite3 程序您的系統End-Of-File 字符(通常為Control-D)使用中斷字符(通常是一個Control-C) 停止長時間運行的SQL 語句
請確認您鍵入一個分號!的每個SQL 命令結束時, sqlite3 程序時查找一個分號知道您的SQL 命令如果省略分號, sqlite3 將給您繼續符如果提示, 等待輸入更多文本添加到當前SQL 命令此功能允許您要輸入SQL 橫跨多行例如:
sqlite > CREATE TABLE tbl2 ( ...> f1 varchar(30 )主鍵, ...> f2 文本. ...> f3 實數 ...> ); sqlite >
除: 僅使用SQLITE_MASTER 表
將顯示"數據庫模式中的一個SQLite 數據庫是存儲在一個特殊的表格"sqlite_master "可以為特殊sqlite_master 表執行"SELECT "語句就像任何其他表在SQLite 數據庫例如:
$sqlite3 ex1 SQLite 版本3611 輸入"幫助"有關說明 sqlite > select *from sqlite_master ; 類型=表 名稱=tbl1 tbl_name =tbl1 rootpage =3 sql =create table tbl1(one varchar(10) , 兩個smallint ) sqlite >
但不能執行DROP TABLE, UPDATE, INSERT 或DELETE 對sqlite_master 表在sqlite_master 表自動為您創建或更新從數據庫中刪除表及索引不能手動修改sqlite_master 表
此模式的TEMPORARY 表沒有存儲在TEMPORARY "sqlite_master "表中的表是不可見的應用程序, 創建該表的應用程序此模式的TEMPORARY 表是存儲在另一個特殊的表格"sqlite_temp_master """sqlite_temp_master "表是臨時本身
特殊命令來sqlite3
在大多數情況下, sqlite3 上讀取的輸入, 並把它們拖到SQLite 庫為執行但是, 如果一個輸入行以點號("") 該行, 然后是截取和nocase sqlite3 程序本身"時, 通常使用這些"dot 命令來更改輸出的格式, 或要執行的某些自帶的查詢的查詢語句
有關服務器可用的點命令, 您可以輸入"幫助"在任意時間例如:
sqlite > 幫助 備份? DB? FILE 備份DB (默認"main ")來FILE bail ON|OFF 停止后, 一個錯誤默認OFF 列表名的數據庫和文件附加數據庫 轉儲? TABLE? 轉儲到數據庫中SQL 文字格式 回音式ON|OFF 打開或關閉命令回顯 exit 退出該程序 解釋ON|OFF 關閉或輸出模式適合於EXPLAIN genfkey ? OPTIONS? 選項有: --no-drop : 請不要刪除舊fkey 觸發器 --ignore-errors : 忽略表提供fkey 錯誤 --exec : 立即執行生成的SQL 請參閱文件tool/genfkeyREADME 在源 分發以獲得進一步的信息 header(s )ON|OFF 關閉或顯示的標題 help 顯示此消息 導入FILE TABLE 在FILE TABLE 用於分隔索引TABLE 只顯示指定的TABLE 上的所有索引 iotrace FILE 啟用I/O 診斷日志記錄設置為FILE 加載FILE ? ENTRY? 加載擴展庫 模式MODE ? TABLE? 設置輸出模式其中MODE 是以下值之一: csv 以逗號分隔的值 列居中的列(參見寬度) html HTML < 表格> 代碼 為TABLE 插入SQL insert 語句 行每行對應一個值 列表中的值用分號分隔分隔字符串 標簽tab-separated 值 tcl TCL 列表元素 nullvalue 將STRING 打印STRING 代替NULL 值 輸出FILENAME 發送輸出以FILENAME 輸出stdout 發送輸出到屏幕 提示MAIN CONTINUE 替換標准提示 quit 退出該程序 在FILENAME 讀取FILENAME 執行SQL 還原? DB? FILE 還原DB 內容(默認的"main ")從FILE 架構? TABLE? 顯示CREATE 語句 輸出模式和使用的分隔符STRING 更改分隔符導入 顯示顯示當前的不同設置的值 表? PATTERN? 列表中的名稱相匹配的表LIKE 圖案 MS 請嘗試打開MS 表鎖定毫秒后超時 定時器ON|OFF 關閉或CPU 計時器測量 寬度NUM NUM設置"column 列寬"模式 sqlite >
更改輸出格式
在sqlite3 程序能夠顯示查詢的結果在八種不同的格式: "csv ""column ""html ""insert ""line ""list ""tabs "和"tcl "可以使用"模式"點命令要切換這些輸出格式
輸出模式的默認設置是"list "在"位置"中, 每個記錄列表寫入一次查詢中每一行輸出和記錄是一個特定的分隔符分隔的字符串默認分隔符是一個管道符號("| ")列出模式時特別有用創建一個查詢的輸出發送給其他程序(例如用於其他處理的AWK)
sqlite > 模式列表 sqlite > select *from tbl1 ; hello|10 goodbye|20 sqlite >
可以使用"分隔符"點命令更改分隔符為列表模式例如, 要將插入一個逗號和空格, 您也可以這樣做:
sqlite > 分隔符", " sqlite > select *from tbl1 ; "你好, 10 再見, 20 sqlite >
在"line "模式下, 每一個列與數據庫中的某行都在單獨一行每行由等號列名, 並進行適當的更改連續記錄通過一個空行分隔下面是一個例子模式行的輸出:
sqlite > 模式行 sqlite > select *from tbl1 ; 一個=hello 兩個=10 一個=再見 兩個=20 sqlite >
在列模式中, 每個記錄都在單獨的一行中對齊與數據列例如:
sqlite > 模式列 sqlite > select *from tbl1 ; 一個兩個 ---------- ---------- hello 10 再見20 sqlite >
默認情況下, 每個列至少為10 個字符寬數據太大以適合列被截斷使用"可以調整列寬寬度&w"命令像這樣:
sqlite > 寬度12 6 sqlite > select *from tbl1 ; 一個兩個 ------------ ------ hello 10 再見20 sqlite >
"寬度&w"命令在以上示例中第一列的寬度設為指定值.以12 並第三列的寬度為6要查看所有其他列寬可以給出任意數量的參數來"在必要時寬度&w"以指定的列寬的任意多個列在您的查詢結果
如果指定列的寬度值為0然后的列寬自動調整是最多只能有三個數字: 10頁眉的寬度首行的寬度, 並將該數據這將使列寬self-adjusting每一列的寬度設置此auto-adjusting 默認值為0值
標志所在列的列標出現在前兩行輸出可以使用"打開和關閉header"點命令在上面的示例中, 列標簽都在已開啟您也可以這樣做:
sqlite > 頁眉處於關閉狀態 sqlite > select *from tbl1 ; hello 10 再見20 sqlite >
另一個有用的輸出模式是"insert "在插入模式下, 則輸出將會在格式化為看起來像是SQL INSERT 語句可以使用insert 模式來生成可以用來輸入數據到不同的數據庫
當指定插入模式, 您要創建一個額外的參數的名稱輸入的表不存檔例如:
sqlite > 插入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 > s< TH > s和< TD > s是html輸出的模式為CGI _ganglia.py 標為很有用
將結果寫入一個文件
默認情況下, sqlite3 會發送: 使用"可以更改此"命令的輸出只需將輸出文件的名稱為一個參數輸出命令及所有后續查詢結果將寫入該文件使用"輸出stdout "以開始寫入標准輸出例如:
sqlite > 模式列表 sqlite > 分隔符| sqlite > 輸出test_file_1文本文件txt sqlite > select *from tbl1 ; sqlite > 退出 $cat test_file_1文本文件txt hello|10 goodbye|20 $
提交到數據庫模式
指定sqlite3 程序提供了幾個方便命令會非常有用啟動時, 模式的數據庫服務器名無效文檔這些命令執行不能執行某些其他方式這些命令都提供了純粹作為一種快捷方式
例如, 來查看數據庫中的表的列表, 可以輸入"表"
sqlite > 表 tbl1 tbl2 sqlite >
"列表模式下表"命令類似於設置然后執行以下查詢:
SELECT 名稱FROM sqlite_master WHERE IN 類型('able '', ''view ")AND NOT LIKE '��qlite_% " UNION ALL SELECT 名稱FROM sqlite_temp_master WHERE IN 類型('able '', ''view '' ) ORDER BY 1
實際上, 如果您這樣的源代碼樹sqlite3 程序(在列表中找到文件src/shellc )您將發現完全符合上面的查詢
"用於分隔索引的工作方式類似"命令來列出所有索引的表中"用於分隔索引"命令接受一個參數, 它是該名稱表的索引不正確last, 但不能有, 為"架構"命令不帶參數, 則"架構"命令顯示原始CREATE TABLE 和CREATE INDEX 語句被用來生成當前的數據庫如果允許用戶名稱"架構", 它展示了在原始CREATE 語句用於將該表和全部如果它的索引我們有:
sqlite > 架構 create table tbl1(one varchar(10) , 兩個smallint ) CREATE TABLE tbl2 ( f1 varchar(30 )主鍵, f2 文本. f3 實數 ) sqlite > 架構tbl2 CREATE TABLE tbl2 ( f1 varchar(30 )主鍵, f2 文本. f3 實數 ) sqlite >
"架構"命令完成設置效果相同的列表模式, 則輸入以下查詢:
SELECT sql FROM (SELECT *FROM sqlite_master UNION ALL SELECT *FROM sqlite_temp_master ) WHERE type!= ''meta " ORDER BY tbl_name , 請輸入DESC, 名
或者, 如果您給出的參數"架構", 因為您只想要為單個表架構, 該查詢是這個樣子:
SELECT sql FROM (SELECT *FROM sqlite_master UNION ALL SELECT *FROM sqlite_temp_master ) WHERE type!= ''meta "AND sql NOT NULL AND 名稱NOT LIKE '��qlite_% " ORDER BY substr(type, 2, 1) , 名稱
您可以提供一個參數bcp命令如果您, 查詢是這個樣子:
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 名稱NOT LIKE '��qlite_% " ORDER BY substr(type, 2, 1) , 名稱
在查詢中的"%s "被替換參數這允許您查看模式對於某些子集的數據庫
sqlite > 架構%abc%
沿着這些同樣的, 而"表"命令也接受一個模式作為其第一個參數如果您給出參數設為表格命令, 一個"% "追加和instr 與LIKE 子句添加到查詢這允許您僅列出這些表, 以匹配特定樣式
"databases "命令顯示了所有在當前連接打開的數據庫總是至少有2第一個為"main ", 則原始數據庫中打開第二個是"temp ", 該數據庫用於臨時表可能還有其他數據庫中列出的數據庫附加使用ATTACH 語句第一個輸出列是附加到的名稱, 第二個列是外部文件的文件名
sqlite > 數據庫
將整個數據庫轉換為一個ASCII 文本的文件
使用"轉儲命令將整個數據庫的內容復制到單個ASCII 文本文件該文件可以轉換回數據庫的管道其返回到sqlite3 .
請在存檔復制一個很好的方式與此數據庫:
$echo ''轉儲"| sqlite3 ex1 | gzip -c> ex1轉儲gz
這生成一個名為ex1轉儲gz包含createbackup 所需要的一切東西的數據庫, 或另一個機器上createbackup數據庫時, 只需輸入:
$zcat ex1轉儲gz| sqlite3 ex2
文字格式為純SQL 因此, 您還可以使用轉儲命令將導出到在應用程序配置中設置的SQLite 數據庫到其他常用的SQL 數據庫引擎像這樣:
$數據庫集群ex2 $sqlite3 ex1轉儲| psql ex2
其他點命令
"解釋"點可以使用下面的命令將輸出模式設置為"column "並設置列寬設置為合理的每個值都在一個EXPLAIN 命令的輸出EXPLAIN命令是一個SQLite-specific SQL 擴展插件后台模式如果任何常規SQL scs 的EXPLAIN, 然后鍵入SQL 命令被解析, 但不執行虛擬機指令序列的條件時, 將已被用於執行SQL 命令返回查詢結果, 如下所示: 例如:
sqlite > 解釋 sqlite > 解釋tbl1 刪除, 其中兩個< 20 ; addr opcode p1 p2 p3 ---- ------------ ----- ----- ------------------------------------- 0ListOpen 00 1打開01tbl1 2下一頁0╟9 3〗字段01 4整數20 0 5ge 02 6鍵00 7ListWrite 00 8goto 02 9noop 00 10 ListRewind 00 11 ListRead 014 12 刪除00 13 goto 011 14 ListClose 00
"超時"命令設定的時間sqlite3 程序將等待對文件的鎖定來清除它正試圖訪問一個錯誤返回之前將超時的默認值零, 以便立即返回一個錯誤如果任何所需的數據庫表或索引已被鎖定
最后, 我們提及"退出"命令導致sqlite3 程序退出
使用sqlite3 在shell 腳本
使用sqlite3 在shell 腳本的一種方法是使用"echo "或""cat "來生成一個文件中的一系列命令然后調用的單元測試將從生成的命令文件的輸入此依舊無法正常運行的是大多數情況下但作為附加的方便, sqlite3 允許單個SQL 命令在命令行輸入的值為第二個參數在數據庫的名稱當啟動sqlite3 程序時, 使用兩個參數第二個參數將被傳遞到SQLite 庫為處理在標准輸出上打印查詢的結果在列表中.模式和這種機制是專為幫助sqlite3 易於使用的程序, 如"awk "結合使用例如:
$sqlite3 ex1 '��elect *從tbl1 "| > awk '{printf " < tr > < td > %s < td > %sn",$1,$2 }' < tr > < td > hello < td > 10 < tr > < td > 再見< td > 20 $
結束shell 命令
SQLite 命令通常由分號終止在shell 也可以使用word "GO "(不區分大小寫), 也可以是一個斜杠字符"/ "變得雜亂結束命令以下是由SQL server 和oracle , 值定義這些無法工作sqlite3_exec( )通過shell , 因為這些轉換為一個分號傳遞到該功能之前
將sqlite3 編譯程序從源
源代碼到命令行sqlite3 接口中的單個名為"shell可以確定c"下載從SQLite 網站首先編譯此文件(一起使用sqlite3 庫源代碼生成可執行文件例如:
gcc -osqlite3 shellc sqlite3c -ldl -lpthread