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 命令手动更新名称缓存。