MySQL Shell 8.4  /  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:「string

用於自動完成的部分 SQL 陳述式。

這些會傳回自動完成的可行候選項目。

選項:

serverVersion:「string

必要。伺服器文法版本。此格式為 major.minor.patch。例如,serverVersion:"8.0.31"

sqlMode:「string

必要。要使用的 SQL 模式。以逗號分隔的字串,例如 sqlMode: "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"。如需詳細資訊,請參閱伺服器 SQL 模式

statementOffset:number

選用。陳述式中插入符號以零為基礎的位移位置。預設值為陳述式的長度。

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 命令手動更新名稱快取。