MySQL Shell 支援在游標前按下 Tab 鍵來自動完成文字。第 3.1 節「MySQL Shell 命令」可以在任何語言模式中自動完成。例如,輸入 \con
並按下 Tab
鍵會自動完成為 \connect
。自動完成功能適用於 SQL、JavaScript 和 Python 語言關鍵字,具體取決於目前的第 5.1 節「使用中語言」。
自動完成支援以下文字物件
在 SQL 模式中,自動完成會感知目前使用中結構描述的結構描述名稱、表格名稱和欄名稱。
-
在 JavaScript 和 Python 模式中,自動完成會感知物件成員,例如
全域物件名稱,例如
session
、db
、dba
、shell
、mysql
、mysqlx
等。全域物件的成員,例如
session.connect()
。全域使用者定義變數
鏈結物件屬性參考,例如
shell.options.verbose
。鏈結 X DevAPI 方法呼叫,例如
col.find().where().execute().fetchOne()
。
預設情況下,會啟用自動完成功能,若要變更此行為,請參閱設定自動完成。
一旦您啟用了自動完成功能,如果游標前的文字只有一個可能的相符項目,則會自動完成文字。如果自動完成功能找到多個可能的相符項目,則會發出嗶聲或在終端機上閃爍。如果再次按下 Tab
鍵,則會顯示可能的完成項目清單。如果找不到相符項目,則不會發生自動完成。
在 SQL 模式中,內容感知自動完成功能會完成任何帶有相關完成項目的字詞。可以自動完成以下項目
結構描述
表格
檢視
欄
預存程序
函數
觸發程序
事件
引擎
使用者定義函數
執行階段函數
記錄檔群組
使用者變數
系統變數
表格空間
使用者
字元集
定序
外掛程式
如果您連線到 MySQL 執行個體但未選取結構描述,則可自動完成全域物件、字元集、引擎、結構描述等等。例如,在預設的 MySQL 安裝上,USE
會建議偵測到的所有結構描述的名稱,除非提供了結構描述名稱中的一或多個相關字元
SQL > use
information_schema mysql performance_schema sys
如果選取了結構描述,則會載入其他結構描述資訊,並可自動完成 (表格、事件等等)。如果您從一個結構描述切換到另一個結構描述,則從先前結構描述載入的物件仍然可自動完成。但是,在工作階段期間新增的任何新物件都無法自動完成,直到執行 \rehash
命令。
若要從選取的結構描述擷取建議清單或完成部分字詞,請輸入初始片段並按兩次 Tab 按鈕。例如
在 SQL 提示字元中,輸入以下片段:
SE
。-
按兩次 Tab 鍵。
以下建議會顯示在您的輸入下方
SET SELECT
在 SQL 提示字元中,輸入以下片段:
SEL
。-
按兩次 Tab 鍵。
片段會自動完成為
SELECT
。
如果可能結果很多,則會提示您是否要顯示結果。例如
Display all 118 possibilities? (y or n)
SQL 自動完成 API
自動完成 API 會透過以下函數公開給開發人員
JavaScript:
shell.autoCompleteSql(statement, options)
Python:
shell.auto_complete_sql(statement, options)
- statement:「
字串
」 用於自動完成的部分 SQL 陳述式。
這些會傳回自動完成的可行候選項目。
選項:
- serverVersion:「
字串
」 必要。伺服器文法版本。這會採用 major.minor.patch 格式。例如,
serverVersion:"8.0.31"
。- sqlMode:「
字串
」 必要。要使用的 SQL 模式。以逗號分隔的字串,例如
sqlMode: "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
。如需詳細資訊,請參閱伺服器 SQL 模式。- statementOffset:
數字
選用。陳述式中插入號的從零開始的偏移位置。預設值是陳述式的長度。
- uppercaseKeywords:[true|false]
預設值
true
。傳回的關鍵字是否為大寫。- filtered:[true|false]
預設值
true
。傳回的明確候選項目名稱是否應使用自動完成的前置詞進行篩選。
此函數會傳回一個字典,描述使用以下語法的陳述式自動完成候選項
{
"context": {
"prefix": string,
"qualifier": list of strings,
"references": list of dictionaries,
"labels": list of strings,
},
"keywords": list of strings,
"functions": list of strings,
"candidates": list of strings,
}
context
:自動完成作業的內容。prefix
:自動完成的片段。-
qualifier
:如果有名稱限定詞則存在。例如
SELECT s
:前置詞為's'
,沒有限定詞。SELECT schema1.t
:前置詞為't'
,限定詞為['schema1']
。SELECT schema1.table1.c
:前置詞為'c'
,限定詞為['schema1','table1']
。SELECT schema1.table1.column1 FR
:前置詞為'FR'
,沒有限定詞。
-
references
:在陳述式中偵測到的參考。schema
:結構描述的名稱。table
:在陳述式中參考的表格名稱。alias
:表格的別名。
labels
:已標記區塊中的標籤。keywords
:候選關鍵字建議。functions
:候選的 MySQL 程式庫 (執行階段) 函數,其名稱也是關鍵字。candidates
:列出一個或多個支援的候選項。結構描述、表格、檢視等等。
例如
JS > shell.autoCompleteSql("select * from ",{serverVersion: "8.0.30", sqlMode: "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"})
{
"candidates": [
"schemas",
"tables",
"views"
],
"context": {
"prefix": ""
},
"functions": [
"JSON_TABLE()"
],
"keywords": [
"DUAL",
"LATERAL"
]
}
在 JavaScript 和 Python 模式中,要完成的字串會從右到左決定,從按下 Tab 時的目前游標位置開始。會忽略方法呼叫內的內容,但語法必須正確。這表示字串、註解和巢狀方法呼叫都必須正確關閉和平衡。這允許正確處理鏈結方法。例如,當您發出
print(db.user.select().where("user in ('foo', 'bar')").e
按下 Tab 鍵會導致自動完成嘗試完成文字 db.user.select().where().e
,但此無效程式碼會產生未定義的行為。會忽略以 .
分隔的符記之間的任何空格,包括換行符號。
預設情況下,會啟用自動完成引擎。本節說明如何停用自動完成以及如何使用 \rehash
MySQL Shell 命令。自動完成會使用 MySQL Shell 感知的資料庫名稱物件快取。啟用自動完成時,會自動更新此名稱快取。例如,每當您載入結構描述時,自動完成引擎會根據結構描述中找到的文字物件更新名稱快取,以便您自動完成表格名稱等等。
若要停用此行為,您可以
使用
--no-name-cache
命令選項啟動 MySQL Shell。修改
shell.options
的autocomplete.nameCache
和devapi.dbObjectHandles
金鑰,以在 MySQL Shell 執行時停用自動完成。
當自動完成名稱快取停用時,您可以手動更新自動完成功能所知道的文字物件,方法是發出 \rehash
指令。這會強制根據目前活動的綱要重新載入名稱快取。
若要在 MySQL Shell 執行時停用自動完成,請使用以下 shell.options
鍵值:
autocomplete.nameCache: boolean
切換 SQL 使用的自動完成名稱快取功能。devapi.dbObjectHandles: boolean
切換 X DevAPIdb
物件(例如db.mytable
、db.mycollection
)使用的自動完成名稱快取功能。
預設情況下,這兩個鍵值都設定為 true
,如果使用 --no-name-cache
命令選項,則設定為 false
。若要在 MySQL Shell 執行時變更 SQL 的自動完成名稱快取,請發出以下指令:
shell.options['autocomplete.nameCache']=true
使用 \rehash
命令手動更新名稱快取。
若要在 MySQL Shell 執行時變更 JavaScript 和 Python 的自動完成名稱快取,請發出以下指令:
shell.options['devapi.dbObjectHandles']=true
同樣地,您可以使用 \rehash
命令手動更新名稱快取。