MySQL Shell 9.0  /  MySQL Shell 程式碼執行  /  程式碼自動完成

5.3 程式碼自動完成

MySQL Shell 支援在游標前按下 Tab 鍵來自動完成文字。第 3.1 節「MySQL Shell 命令」可以在任何語言模式中自動完成。例如,輸入 \con 並按下 Tab 鍵會自動完成為 \connect。自動完成功能適用於 SQL、JavaScript 和 Python 語言關鍵字,具體取決於目前的第 5.1 節「使用中語言」

自動完成支援以下文字物件

  • 在 SQL 模式中,自動完成會感知目前使用中結構描述的結構描述名稱、表格名稱和欄名稱。

  • 在 JavaScript 和 Python 模式中,自動完成會感知物件成員,例如

    • 全域物件名稱,例如 sessiondbdbashellmysqlmysqlx 等。

    • 全域物件的成員,例如 session.connect()

    • 全域使用者定義變數

    • 鏈結物件屬性參考,例如 shell.options.verbose

    • 鏈結 X DevAPI 方法呼叫,例如 col.find().where().execute().fetchOne()

預設情況下,會啟用自動完成功能,若要變更此行為,請參閱設定自動完成

一旦您啟用了自動完成功能,如果游標前的文字只有一個可能的相符項目,則會自動完成文字。如果自動完成功能找到多個可能的相符項目,則會發出嗶聲或在終端機上閃爍。如果再次按下 Tab 鍵,則會顯示可能的完成項目清單。如果找不到相符項目,則不會發生自動完成。

自動完成 SQL

在 SQL 模式中,內容感知自動完成功能會完成任何帶有相關完成項目的字詞。可以自動完成以下項目

  • 結構描述

  • 表格

  • 檢視

  • 預存程序

  • 函數

  • 觸發程序

  • 事件

  • 引擎

  • 使用者定義函數

  • 執行階段函數

  • 記錄檔群組

  • 使用者變數

  • 系統變數

  • 表格空間

  • 使用者

  • 字元集

  • 定序

  • 外掛程式

如果您連線到 MySQL 執行個體但未選取結構描述,則可自動完成全域物件、字元集、引擎、結構描述等等。例如,在預設的 MySQL 安裝上,USE 會建議偵測到的所有結構描述的名稱,除非提供了結構描述名稱中的一或多個相關字元

         SQL > use 
         information_schema  mysql  performance_schema  sys

如果選取了結構描述,則會載入其他結構描述資訊,並可自動完成 (表格、事件等等)。如果您從一個結構描述切換到另一個結構描述,則從先前結構描述載入的物件仍然可自動完成。但是,在工作階段期間新增的任何新物件都無法自動完成,直到執行 \rehash 命令。

若要從選取的結構描述擷取建議清單或完成部分字詞,請輸入初始片段並按兩次 Tab 按鈕。例如

  1. 在 SQL 提示字元中,輸入以下片段:SE

  2. 按兩次 Tab 鍵。

    以下建議會顯示在您的輸入下方

                SET SELECT
  3. 在 SQL 提示字元中,輸入以下片段:SEL

  4. 按兩次 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

在 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.optionsautocomplete.nameCachedevapi.dbObjectHandles 金鑰,以在 MySQL Shell 執行時停用自動完成。

當自動完成名稱快取停用時,您可以手動更新自動完成功能所知道的文字物件,方法是發出 \rehash 指令。這會強制根據目前活動的綱要重新載入名稱快取。

若要在 MySQL Shell 執行時停用自動完成,請使用以下 shell.options 鍵值:

  • autocomplete.nameCache: boolean 切換 SQL 使用的自動完成名稱快取功能。

  • devapi.dbObjectHandles: boolean 切換 X DevAPI db 物件(例如 db.mytabledb.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 命令手動更新名稱快取。