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: "
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 模式下,要完成的字符串是从右到左确定的,从按 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
命令手动更新名称缓存。