除了互動式程式碼執行之外,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']);