MySQL Shell 9.0  /  ...  /  在 JavaScript 和 Python 模式中使用腳本工作階段

4.2.3 在 JavaScript 和 Python 模式中使用腳本工作階段

您可以使用 JavaScript 和 Python 模式中提供的函式,建立您選擇的類型的多個工作階段物件,並將它們指派給變數。這些工作階段物件可讓您建立和管理並行連線,以從單一 MySQL Shell 執行個體以多種方式與多個 MySQL Server 執行個體或相同的執行個體搭配使用。

建立工作階段物件的函式可在 mysqlxmysql JavaScript 和 Python 模組中使用。這些模組必須在使用前匯入,這會在互動模式中使用 MySQL Shell 時自動完成。函式 mysqlx.getSession() 使用指定的連線資料開啟與 MySQL Server 執行個體的 X Protocol 連線,並傳回代表連線的 Session 物件。函式 mysql.getClassicSession()mysql.getSession() 使用指定的連線資料開啟與 MySQL Server 執行個體的傳統 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() 方法但未將其指派給變數,則其連線會關閉,如果您想要再次使用它,則必須重新建立工作階段物件。