MySQL Shell 9.0  /  MySQL Shell 程式碼執行  /  批次程式碼執行

5.6 批次程式碼執行

除了互動式程式碼執行外,MySQL Shell 還提供以下來源的批次程式碼執行:

  • 載入以進行處理的檔案。

  • 包含程式碼且重新導向至標準輸入以進行執行的檔案。

  • 重新導向至標準輸入以進行執行的不同來源的程式碼。

提示

除了以批次方式執行檔案外,您也可以從終端機控制 MySQL Shell,請參閱第 5.8 節,「API 命令列整合」

在批次模式中,第 5.2 節,「互動式程式碼執行」中所述的所有命令邏輯均不可用,只能執行啟用語言的有效程式碼。當處理 SQL 程式碼時,會使用以下邏輯逐條執行語句:讀取/處理/列印結果。當處理非 SQL 程式碼時,會從輸入來源完整載入並作為一個單元執行。使用 --interactive (或 -i) 命令列選項,將 MySQL Shell 設定為將輸入來源視為在互動模式中發出一般處理;這樣就能在批次處理中使用互動模式提供的所有功能。

注意

在這種情況下,無論來源為何,都會逐行讀取並使用互動式管線處理。

輸入會根據 MySQL Shell 中選取的目前程式設計語言進行處理,預設為 JavaScript。您可以使用 defaultMode MySQL Shell 設定選項,變更預設程式設計語言。副檔名為 .js.py.sql 的檔案,一律會以適當的語言模式處理,無論預設程式設計語言為何。

此範例說明如何從檔案載入 JavaScript 程式碼以進行批次處理

$> mysqlsh --file code.js

在此,JavaScript 檔案會重新導向至標準輸入以進行執行

$> mysqlsh < code.js

以下範例說明如何在 Linux 平台上,將 SQL 程式碼重新導向至標準輸入以進行執行

$> echo "show databases;" | mysqlsh --sql --uri user@192.0.2.20:33060
注意

若要在 Windows 平台上執行此命令,您必須移除 echo 命令中字串周圍的引號。

可使用 --pym 命令列選項,以 Python 模式將指定的 Python 模組作為指令碼執行。此選項的運作方式與 Python 的 -m 命令列選項相同。

可執行指令碼

在 Linux 上,您可以建立使用 MySQL Shell 執行的可執行指令碼,方法是在指令碼的第一行包含 #! 行。此行應提供 MySQL Shell 的完整路徑,並包含 --file 選項。例如

#!/usr/local/mysql-shell/bin/mysqlsh --file
print("Hello World\n");

指令碼檔案必須在檔案系統中標示為可執行。執行指令碼會叫用 MySQL Shell,並執行指令碼的內容。

指令碼中的 SQL 執行

用於 X Protocol 工作階段的 SQL 查詢執行通常會使用 sql() 函數,此函數會將 SQL 語句當作字串,並傳回 SqlExecute 物件,您可以使用此物件來繫結及執行查詢,並傳回結果。此方法已在使用工作階段 SQL 中說明。不過,用於傳統 MySQL 通訊協定工作階段的 SQL 查詢執行會使用 runSql() 函數,此函數會將 SQL 語句及其參數,將指定的參數繫結至指定的查詢中,並以單一步驟執行查詢,以傳回結果。

如果您需要建立與用於連線至 MySQL 伺服器的通訊協定無關的 MySQL Shell 指令碼,則 MySQL Shell 為 X Protocol 提供 session.runSql() 函數,其運作方式與傳統 MySQL 通訊協定工作階段中的 runSql() 函數相同。您可以在 MySQL Shell 中只使用此函數來取代 sql(),以便您的指令碼可與 X Protocol 工作階段或傳統 MySQL 通訊協定工作階段搭配使用。Session.runSql() 會傳回 SqlResult 物件,其符合傳統 MySQL 通訊協定函數傳回的 ClassicResult 物件規格,因此可以使用相同的方式處理結果。

注意

Session.runSql() 是 JavaScript 和 Python 中 MySQL Shell X DevAPI 實作專有的,並非標準 X DevAPI 的一部分。

若要瀏覽查詢結果,您可以使用 fetchOneObject() 函數,此函數適用於傳統 MySQL 通訊協定和 X Protocol。此函數會以指令碼物件傳回下一個結果。資料行名稱會當作字典中的鍵 (如果它們是有效的識別碼,則會當作物件屬性),且資料列值會當作字典中的屬性值。對物件所做的更新不會保留在資料庫中。

例如,此 MySQL Shell 指令碼中的程式碼可搭配 X Protocol 工作階段或傳統 MySQL 通訊協定工作階段使用,以從指定的國家/地區擷取並輸出城市名稱

var resultSet = mySession.runSql("SELECT * FROM city WHERE countrycode = ' AUT'");
var row = resultSet.fetchOneObject();
print(row['Name']);