MySQL Shell 提供公开不同功能的全局对象,例如dba
InnoDB Cluster 和 InnoDB ReplicaSet 管理操作,util
实用程序功能等。全局对象提供从 MySQL Shell 中的脚本模式调用的函数。除了交互式 MySQL Shell 集成外,您还可以使用命令行集成直接从终端调用对象函数,使您可以轻松地与其他工具集成。
以交互方式使用MySQL Shell自带的API时,典型的函数语法如下:
object.functionName(parameter1, parameter2, ..., parameterN)
这些参数定义了向 API 函数提供数据的顺序。在大多数情况下,API 函数需要特定数据类型的参数,但也有少数例外情况,其中特定参数可以处理多种数据类型。API 函数中用于参数的数据类型可以是以下之一:
标量:字符串、数字、布尔值、null
列表
字典:键是字符串的键值对
对象
列表参数通常仅限于包含预定义数据类型的元素,例如字符串列表,但是,可能存在支持不同数据类型项的列表参数。
字典参数接受
key
-value
对,其中keys
是字符串。value
通常期望与键相关联的是预定义的数据类型。
但是,可能存在同一键的值支持不同数据类型的情况。因此,字典参数可以是以下类型之一:
允许一组预定义的键值对,在这种情况下,指定不在预定义集中的键会导致错误。
不存在预定义的一组键值对,字典接受任何键
换句话说,一些字典参数指定哪些键是有效的。对于这些参数,尝试使用该组之外的键会导致错误。当不存在预定义值集时,可以使用任何数据类型的任何值。没有预定义键列表的字典参数接受任何键值对,只要该键不在不同字典参数的预定义集中即可。
要使用命令行集成调用全局对象公开的 API 函数,而不必在 MySQL Shell 中启动交互式会话,您必须以正确的方式提供所需的数据。这包括定义调用 API 函数的方式,以及将其参数从命令行参数映射到 API 参数的方式。
并非所有 MySQL Shell 函数都由命令行集成公开。例如,一个函数
dba.getCluster()
依赖于返回一个对象,然后在进一步的操作中使用该对象。命令行集成不会公开此类操作。
同样,MySQL Shell 命令行集成也不支持对象作为参数。任何带有对象类型参数的 API 函数都不能与命令行集成一起使用。对象的生命周期限于创建它的 MySQL Shell 调用的生命周期。由于mysqlsh在通过此 API 语法执行对象方法后立即退出,因此从 API 调用接收或传递到 API 调用的任何对象将立即超出范围。在开发要通过命令行集成公开的 MySQL Shell 插件时,应考虑这一点。
从命令行调用 MySQL Shell API 函数的一般格式是:
$ mysqlsh [shell options] -- [shell_object]+ object_function [anonymous_arguments|named arguments]*
在哪里:
shell_object
: 指定一个全局对象,其函数公开供命令行使用。支持以空格分隔的列表中的嵌套对象。object_function
shell_object
: 指定应执行 的最后一个 API 函数 。[anonymous_arguments|named arguments]*
: 指定传递给object_function
调用 的参数
大多数可用的 API 都需要一个对象,例如:
$ mysqlsh -- shell status
但对于嵌套对象,必须指明对象列表。例如,要调用由 公开的函数
shell.options
,例如
setPersist(optionName, value)
,请使用语法:
$ mysqlsh -- shell options set-persist defaultMode py
类似的情况可能发生在 MySQL Shell 插件中定义的嵌套对象。
传递给函数的参数可以分为以下类型:
-
匿名参数:这是提供给命令的原始值。例如,在以下调用
1
中,one
和true
是匿名参数:$ mysqlsh -- object command 1 one true
-
命名参数:以
--key=value
. 例如在下面的调用中,--sample
和--path
被命名为参数:$ mysqlsh -- object command 1 one true --sample=3 --path=some/path
鉴于参数的这种划分,从命令行集成调用 API 函数的一般格式是:
$ mysqlsh [shell options] -- object command [anonymous arguments][named arguments]
any 的顺序anonymous
arguments
很重要,因为它们是以位置方式处理的。另一方面,named
arguments
可以出现在任何地方,因为它们首先被处理并与相应的参数相关联。一旦处理了命名参数,匿名参数就会以位置方式处理。