MySQL Shell 8.4  /  ...  /  在 JavaScript 和 Python 模式下編寫腳本會話

4.2.3 在 JavaScript 和 Python 模式下編寫腳本會話

您可以使用 JavaScript 和 Python 模式中可用的函式,建立您選擇的類型的多個會話物件,並將其指派給變數。這些會話物件可讓您建立和管理並行連線,從單一 MySQL Shell 執行個體以多種方式使用多個 MySQL 伺服器執行個體,或與同一個執行個體搭配使用。

建立會話物件的函式可在 mysqlxmysql JavaScript 和 Python 模組中使用。這些模組必須在使用前匯入,當 MySQL Shell 在互動模式中使用時,會自動完成此操作。函式 mysqlx.getSession() 使用指定的連線資料開啟與 MySQL 伺服器執行個體的 X Protocol 連線,並傳回一個 Session 物件來表示連線。函式 mysql.getClassicSession()mysql.getSession() 使用指定的連線資料開啟與 MySQL 伺服器執行個體的傳統 MySQL 通訊協定連線,並傳回一個 ClassicSession 物件來表示連線。透過這些函式,MySQL Shell 使用的連線通訊協定內建於函式中,而不是使用單獨的選項來選擇,因此您必須選擇適當的函式來符合連接埠的正確通訊協定。

MySQL Shell 在 shell 全域物件中提供了 openSession() 方法,該方法可以在 JavaScript 或 Python 模式中使用。shell.openSession() 可以同時使用 X Protocol 和傳統 MySQL 通訊協定。您可以將連線通訊協定指定為連線資料的一部分,或讓 MySQL Shell 根據您的其他連線參數(例如通訊協定的預設連接埠號碼)自動偵測它。

所有這些函式的連線資料都可以指定為類似 URI 的連線字串,或指定為鍵值組的字典。您可以使用指派會話物件的變數來存取傳回的會話物件。此範例示範如何使用 mysql.getClassicSession() 函式開啟傳統 MySQL 通訊協定連線,該函式會傳回一個 ClassicSession 物件來表示連線

mysql-js> var s1 = mysql.getClassicSession('user@localhost:3306', 'password');
mysql-js> s1
<ClassicSession:user@localhost:3306>

此範例示範如何在 Python 模式下使用 shell.openSession() 來開啟需要壓縮連線的 X Protocol 連線。會傳回 Session 物件

mysql-py> s2 = shell.open_session('mysqlx://user@localhost:33060?compression=required', 'password')
mysql-py> s2
<Session:user@localhost:33060>

您使用這些函式在 JavaScript 模式中建立的會話物件只能在 JavaScript 模式中使用,如果在 Python 模式中建立會話物件,也會發生相同的情況。您無法在 SQL 模式中建立多個會話物件。雖然您只能在使用其建立模式的變數中參照會話物件,但您可以使用任何模式中的 shell.setSession() 方法,將您已建立並指派給變數的會話物件設定為 session 全域物件。例如

mysql-js> var s3 = mysqlx.getSession('user@localhost:33060', 'password');
mysql-js> s3
<Session:user@localhost:33060>
mysql-js> shell.setSession(s3);
<Session:user@localhost:33060>
mysql-js> session
<Session:user@localhost:33060>
mysql-js> shell.status();
 shell.status()
MySQL Shell version 8.1.0-commercial

Connection Id:                9
Current schema:
Current user:                 root@localhost
SSL:                          Cipher in use: TLS_AES_256_GCM_SHA384 TLSv1.3
Using delimiter:              ;
Server version:               8.1.0-commercial MySQL Enterprise Server - Commercial
Protocol version:             Classic 10
Client library:               8.1.0
Connection:                   localhost via TCP/IP
TCP port:                     3306
Server characterset:          utf8mb4
Schema characterset:          utf8mb4
Client characterset:          utf8mb4
Conn. characterset:           utf8mb4
Result characterset:          utf8mb4
Compression:                  Disabled
Uptime:                       9 hours 42 min 5.0000 sec

Threads: 2  Questions: 61  Slow queries: 0  Opens: 176  Flush tables: 3  Open tables: 95  Queries per second avg: 0.001

現在可以使用 session 全域物件來使用會話物件 s3,因此可以從 MySQL Shell 的任何模式存取它所代表的 X Protocol 連線:SQL 模式、JavaScript 模式和 Python 模式。現在也可以使用 shell.status() 方法顯示此連線的詳細資訊,該方法僅顯示 session 全域物件所代表的連線的詳細資訊。如果 MySQL Shell 執行個體有一個或多個開啟的連線,但沒有任何一個連線設定為 session 全域物件,則 shell.status() 方法會傳回 未連線

您使用 shell.setSession() 設定的會話物件會取代設定為 session 全域物件的任何現有會話物件。如果取代的會話物件最初是使用 mysqlxmysql 函式或 shell.openSession() 建立並指派給變數,則該會話物件仍然存在,其連線仍保持開啟。您可以在最初建立它的 MySQL Shell 模式中繼續使用此連線,並且您可以隨時使用 shell.setSession() 將其再次設為 session 全域物件。如果取代的會話物件是使用 shell.connect() 方法建立並指派給變數,則情況相同。如果取代的會話物件是在啟動 MySQL Shell 時建立,或使用 \connect 命令建立,或使用 shell.connect() 方法建立,但未將其指派給變數,則其連線會關閉,如果您想再次使用它,必須重新建立會話物件。