MySQL Shell 支持通过按Tab键自动完成光标前的文本。第
3.1 节,“MySQL Shell 命令”可以在任何语言模式下自动完成。例如,键入
\con并按下
Tab键自动完成到
\connect. 根据当前的第 5.1 节“活动语言”,自动完成可用于 SQL、JavaScript 和 Python 语言关键字。
自动完成支持以下文本对象:
在 SQL 模式下,自动完成知道当前活动模式的模式名、表名、列名。
-
在 JavaScript 和 Python 模式中,自动补全会识别对象成员,例如:
全局对象名称,例如
session,db,dba,shell,mysql,mysqlx等。全局对象的成员,例如
session.connect()、dba.configureLocalInstance()等。全局用户定义变量
链式对象属性引用,例如
shell.options.verbose.链式 X DevAPI 方法调用,例如
col.find().where().execute().fetchOne().
默认情况下启用自动完成,要更改此行为,请参阅 配置自动完成。
激活自动完成后,如果光标前的文本恰好有一个可能的匹配项,则该文本将自动完成。如果自动完成找到多个可能的匹配项,它会发出哔哔声或使终端闪烁。如果Tab再次按下该键,则会显示可能完成的列表。如果未找到匹配项,则不会发生自动完成。
在 SQL 模式下,上下文感知自动完成功能可以完成任何具有相关完成功能的单词。从 MySQL Shell 8.0.31 开始,可以自动完成以下内容:
图式
表
观点
列
存储过程
功能
触发器
事件
引擎
用户自定义函数
运行时函数
日志文件组
用户变量
系统变量
表空间
用户
字符集
排序规则
插件
如果您连接到 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 通过以下函数暴露给开发者:
脚本:
shell.autoCompleteSql(statement, options)Python:
shell.auto_complete_sql(statement, options)
-
声明:“
string” 用于自动完成的部分 SQL 语句。
这些返回自动完成的可行候选者。
选项:
-
服务器版本:“
string” 必需的。服务器语法版本。这采用 major.minor.patch 格式。
serverVersion:"8.0.31", 例如。-
sql模式:“
string” 必需的。要使用的 SQL 模式。逗号分隔的字符串,
sqlMode: "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"例如。有关详细信息,请参阅 服务器 SQL 模式。-
statementOffset:
number 可选的。插入符号在语句中从零开始的偏移位置。默认值是 的长度
statement。- 大写关键字:[true|false]
默认
true。返回的关键字是否大写。- 过滤:[真|假]
默认
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
按 T ab 键会导致自动完成尝试完成文本
db.user.select().where().e,但此无效代码会产生未定义的行为。由 a 分隔的标记之间的任何空格(包括换行符)
都将.被忽略。
默认情况下,自动完成引擎是启用的。本节介绍如何禁用自动完成以及如何使用
\rehashMySQL Shell 命令。自动完成使用 MySQL Shell 知道的数据库名称对象的缓存。启用自动完成后,此名称缓存会自动更新。例如,无论何时加载模式,自动完成引擎都会根据模式中找到的文本对象更新名称缓存,以便您可以自动完成表名等。
要禁用此行为,您可以:
--no-name-cache使用命令选项 启动 MySQL Shell 。修改 的
autocomplete.nameCache和devapi.dbObjectHandles键shell.options以在 MySQL Shell 运行时禁用自动完成。
当禁用自动完成名称缓存时,您可以通过发出
\rehash. 这会强制根据当前活动模式重新加载名称缓存。
要在 MySQL Shell 运行时禁用自动完成,请使用以下shell.options键:
autocomplete.nameCache: boolean切换供 SQL 使用的自动完成名称缓存。devapi.dbObjectHandles: boolean切换 X DevAPIdb对象使用的自动完成名称缓存,例如db.mytable,db.mycollection。
true默认情况下,
这两个键都设置为,false如果使用
--no-name-cache命令选项,则设置为。要在 MySQL Shell 运行时更改 SQL 的自动完成名称缓存,请发出:
shell.options['autocomplete.nameCache']=true
使用\rehash命令手动更新名称缓存。
要在 MySQL Shell 运行时更改 JavaScript 和 Python 的自动完成名称缓存,请发出:
shell.options['devapi.dbObjectHandles']=true
同样,您可以使用该\rehash命令手动更新名称缓存。