MySQL Shell 8.4  /  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']);