SQLite 系列 - 創建、附加和分離數據庫
創建數據庫
SQLite 的 sqlite3 命令被用來創建新的 SQLite 數據庫 [1]。您不需要任何特殊的權限即可創建一個數據。
我們需要在路徑D:\myDatas\SQLiteDB\db
下創建數據庫,數據庫路徑和名稱如下:
D:\myDatas\SQLiteDB\db\sqlite_02_op_db.db
在當前文件夾路徑下,輸入 cmd 回車,然後執行如下命令創建數據庫:
D:\myDatas\SQLiteDB\db>sqlite3 sqlite_02_op_db.db
SQLite version 3.45.3 2024-04-15 13:34:05 (UTF-16 console I/O)
Enter ".help" for usage hints.
sqlite>
可以看到,在路徑D:\myDatas\SQLiteDB\db
下使用命令sqlite3 sqlite_02_op_db.db
創建了數據庫,創建數據庫文件後,提供了一個 sqlite> 提示符。接着,使用點命令 .databases
來檢查其是否在數據庫列表中:
sqlite> .databases
main: D:\myDatas\SQLiteDB\db\sqlite_02_op_db.db r/w
使用.show
命令查看默認的輸出模式:
sqlite> .show
echo: off
eqp: off
explain: auto
headers: off
mode: list
nullvalue: ""
output: stdout
colseparator: "|"
rowseparator: "\n"
stats: off
width:
filename: sqlite_02_op_db.db
sqlite>
這也能看到我們創建的新數據庫的名稱。
使用.quit
命令退出 sqlite 提示符:
sqlite> .quit
D:\myDatas\SQLiteDB\db>
數據庫轉存與恢復
可以在命令提示符中使用.dump
命令來導出完整的數據庫在一個文本文件中,比如將剛創建的sqlite_02_op_db.db
數據庫存儲到sqlite_02_op_db.sql
文件中:
D:\myDatas\SQLiteDB\db>sqlite3 sqlite_02_op_db.db .dump > sqlite_02_op_db_test.sql
上面的命令將轉換整個sqlite_02_op_db.db
據庫的內容到 SQLite 的語句中,並將其轉儲到 ASCII 文本文件sqlite_02_op_db_test.sql
中。
接着,在 DOS 窗口中使用dir
命令查看路徑下的文件:
D:\myDatas\SQLiteDB\db>dir
驅動器 D 中的卷是 軟件
卷的序列號是 6148-6C08
D:\myDatas\SQLiteDB\db 的目錄
2024/05/16 22:13 <DIR> .
2024/05/16 22:13 <DIR> ..
2024/05/16 22:06 0 sqlite_02_op_db.db
2024/05/16 22:12 55 sqlite_02_op_db_test.sql
2 個文件 55 字節
2 個目錄 33,186,635,776 可用字節
可以看到最後多了一個sqlite_02_op_db_test.sql
文件。使用編輯器打開文件,內容如下:
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
COMMIT;
因爲剛創建的數據庫是一個空的數據庫,裏面沒有任何內容,所以導出的 SQL 也只是一些配置信息。
通過簡單的方式從生成的sqlite_02_op_db_test.sql
恢復到 db:
D:\myDatas\SQLiteDB\db>sqlite3 sqlite_02_op_db_test_recover.db < sqlite_02_op_db_test.sql
我們將sqlite_02_op_db_test.sql
的數據恢復到sqlite_02_op_db_test_recover.db
數據庫中,使用 dir
命令可查看現在的文件:
D:\myDatas\SQLiteDB\db>dir
驅動器 D 中的卷是 軟件
卷的序列號是 6148-6C08
D:\myDatas\SQLiteDB\db 的目錄
2024/05/16 22:17 <DIR> .
2024/05/16 22:17 <DIR> ..
2024/05/16 22:06 0 sqlite_02_op_db.db
2024/05/16 22:12 55 sqlite_02_op_db_test.sql
2024/05/16 22:17 0 sqlite_02_op_db_test_recover.db
3 個文件 55 字節
2 個目錄 33,186,504,704 可用字節
可以看到最後面多出來的文件,就是剛剛恢復的數據庫。
附加數據庫
在實際使用時,通常有這樣的需求,在數據庫 A 中存的數據不全,可能需要到其他數據庫中去查詢,比如去 B 數據庫中查;對於這樣的需求,如果是其他數據庫可能實現起來比較麻煩,但在 SQLite 中可以通過附加數據庫的方式輕鬆實現。
SQLite 可以通過ATTACH DATABASE
語句來選擇需要的數據庫來使用,使用該命令後,所有的 SQLite 語句將在附加的數據庫下執行。
我們接着上面的例子來說,現在D:\myDatas\SQLiteDB\db
文件路徑下已經有 2 個數據庫了,我們在sqlite_02_op_db.db
數據庫中附加sqlite_02_op_db_test_recover.db
數據庫,在 DOS 命令窗裏面執行如下命令使用sqlite_02_op_db.db
數據庫:
D:\myDatas\SQLiteDB\db>sqlite3 sqlite_02_op_db.db
SQLite version 3.45.3 2024-04-15 13:34:05 (UTF-16 console I/O)
Enter ".help" for usage hints.
sqlite>
sqlite3 sqlite_02_op_db.db
命令既是創建數據庫,也是使用數據庫,當文件不存在時就創建,存在時就直接使用。接着執行如下命令:
sqlite> attach database 'D:\myDatas\SQLiteDB\db\sqlite_02_op_db_test_recover.db' as 's';
sqlite>
D:\myDatas\SQLiteDB\db\sqlite_02_op_db_test_recover.db
是數據庫路徑,後面的s
是附加這個數據庫的別名。使用.databases
來檢驗是否附加成功:
sqlite> .databases
main: D:\myDatas\SQLiteDB\db\sqlite_02_op_db.db r/w
s: D:\myDatas\SQLiteDB\db\sqlite_02_op_db_test_recover.db r/w
sqlite>
可以看到,別名爲main
是我們主數據庫,而別名爲s
的數據庫是剛附加的數據庫;如果有數據的話,就可以在main
數據庫中操作s
數據庫中的數據了(這個後續會講到)。其中還有一個temp
數據庫名沒有顯示出來,main 和 temp 是無法分離的。
注意:數據庫名稱 main 和 temp 被保留用於主數據庫和存儲臨時表及其他臨時數據對象的數據庫。這兩個數據庫名稱可用於每個數據庫連接,且不應該被用於附加,否則將得到一個警告消息,如下所示:
sqlite> attach database 'D:\myDatas\SQLiteDB\db\sqlite_02_op_db_test_recover.db' as 'temp';
Runtime error: database temp is already in use
得到的信息是這個 temp 數據庫已經被使用了,不能用作附加數據庫的別名;同理,main 也一樣。
分離數據庫
如果同一個數據庫文件已經被附加上多個別名,DETACH 命令將只斷開給定名稱的連接,而其餘的仍然有效。但無法分離 main 或 temp 數據庫。
這裏我們將上面附加的數據庫s
從主數據庫中分離出來,使用如下命令:
sqlite> detach database 's';
sqlite>
s
就是前面附加數據庫的別名,接着使用.database
命令來查看:
sqlite> .database
main: D:\myDatas\SQLiteDB\db\sqlite_02_op_db.db r/w
sqlite>
現在就只能看到一個數據庫了。
以上就是本節的全部內容了,後續還會繼續介紹數據表的操作。
引用鏈接
[1]
數據庫: https://www.dba.cn/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/IubqNY92-RL8w4btLr16tA