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