除了互動式程式碼執行外,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,並執行指令碼的內容。
用於 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']);